事务一共有四个特性:原子性、隔离性、持久性、一致性。简称ACID。本文所将就是其中的隔离性。
1、事务中因为隔离原因导致的并发问题有哪些?
脏读:当事务A对一个数据进行修改,但这个操作还未提交,但此时事务B就已经读取到了这个修改后的数据,并依据这个修改后的数据进行接下来的操作。这就是脏读。
不可重复读:当事务A读取数据,然后对这个数据进行操作,然后再操作期间事务B对这个数据进行了修改,则等事务A再次读取这个数据时,和一开始读取到的值并不一样,这就是不可重复读。
幻读:幻读和不可重复读有点类似,幻读是事务A对表中所有属“猪”的人删掉,而此时事务B对表中查入一条属“猪”的人的数据,并进行提交,此时事务A就会以为出现幻觉了,没有进行删除操作。
脏读是对未提交的数据的读取,而不可重复读和幻读都是对已提交数据的读取。不可重复读的重点是修改,幻读的重点在于新增或者删除。
2、事务中的隔离级别
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。(MySQL默认级别)
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 | 脏读 | 不可重复读 | 幻影读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
3、修改隔离级别
开启事务:
start transaction;
结束事务:
commit; 或者 rollback;
查看隔离级别
select @@transaction_isolation;
修改隔离级别
set session transaction isolation level read committed; #设置为读已提交