通过设置事务的隔离级别
v代表未解决,x代表已解决
脏读 不可重复读 幻读 1、READ UNCOMMITTED √ √ √ 2、READ COMMITTED x √ √ 3、REPEATABLE READ x x √ 4、SERIALIZABLE(串行化) x x x
详解:
Read uncommitted
A事务可以读取未提交事务B的数据
会出现的问题:
脏读: B事物修改数据a=1,但是没有提交,A事物读取数据a=1,A事物拿到数据后显示,此时B事物回滚,再次修改数据a=2,然后提交,所以实际数据a=2,但是A事物拿到的是a=1.
Read committed
A事务要等B事务提交后才能读取数据
会出现的问题:
不可重复读:A事物读取a=1,A事物再次读取a,此时B事物修改了a=2, A事物等待B提交后读取a,此时a=2,一个事务范围内两个相同的查询却返回了不同数据.
Repeatable read
重复读,就是在A事物开始读取数据(事务开启)时,B事物不被允许修改操作(修改对应的是UPDATE操作)
A事物读取数据a=1, 此时B事物将不被允许修改数据a,直到A事物执行完毕,B事物才可以执行修改数据a.
会出现的问题:
幻读:A事物读取整个表的总金额a,由于Repeatable read对应的是update操作,所以insert新的数据时,两个事物可以同时进行,这会导致A事物再次查询时,数据a发生了变化.
Serializable 序列化
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。
Mysql的默认隔离级别是Repeatable read。
参考:
https://www.cnblogs.com/ubuntu1/p/8999403.html