数据库并发问题和事务隔离界别
一、数据库的并发问题
1. 脏读
对于两个事务A,B,A读取了B更新的数据,但是B没有commit
2. 不可重复读
A读取了一个字段,然后B更新了这个字段,接着A再次读取这个字段。这样A就获取到了两个不同的字段
3. 幻读
A事务select了数据,然后B事务insert了,A再次select的话和第一次结果不一样
二、事务隔离界别
MySQL数据库事务要完成的目标:
- 原子性(atomicity): 指所有在事务中的操作要么都成功,要么都不成功,所有的操作都不可分割,没有中间状态。一旦某一步执行失败,就会全部回滚到初始状态。
- 一致性(consistency): 指的是逻辑上的一致性,即所有操作是符合现实当中的期望的
- 隔离性(isolation): 即不同事务之间的相互影响和隔离的程度。比如,不同的隔离级别,事务的并发程度也不同,最强的隔离状态是所有的事务都是串行化的(serializable)(即一个事务完成之后才能进行下一个事务),这样并发性也会降到最低,在保证了强一致性的情况下,性能也会受很大影响,所以在实际工程当中,往往会折中一下。
- 持久性(durability): 可以简单地理解为事务执行完毕后数据 不可逆并持久化存储 于存储系统当中
1. Read Uncommited:读未提交的数据
允许事务读取未被其他事务提交的数据。脏读、不可重复读、幻读三个问题都存在
2. Read Commit:读已提交的数据
允许事务读其他事务已经提交的数据。只可以避免脏读
3. Repeatable Read:可重复读
当前事务可以重复读取某个字段,实现方式就是禁止其他事务对这个字段的更新操作。遗留了幻读的问题
4. Serializable: 串行
事务可以从一个表中读物相同的行,实现方式是在这个事务执行期间,禁止其他事务对该表进行insert、update、delete
三、查看事务
事务级别越高,问题越少,但是性能越差。MySQL innodb默认事务隔离级别是RR(repeatable read)。
-- 查看当前会话bai隔离级别
select @@tx_isolation;
-- 设置当前会话隔离级别(read uncommitted, read committed, repeatable read, serializable)
set session transaction isolatin level repeatable read;
-- 查看系统当前隔离级别du
select @@global.tx_isolation;
-- 设置系统当前隔离级别
set global transaction isolation level repeatable read;
-- 事务使用
begin;
rollback;
commit;