如何避免事务的并发问题?

通过设置事务的隔离级别
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

猜你喜欢

转载自www.cnblogs.com/sea-stream/p/11297934.html