浅谈ACID 事务分析

浅谈ACID 事务分析并发问题总结 隔离级别
概念
事务就是由一系列对系统中对数据进行操作的组成的一个程序可执行的单元,狭义上的事务特指数据库的事务
事务并发处理问题
如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同事使用相同的数据时可能会发生问题(丢失事务修改,读脏数据,不可重复度,产生幽灵数据)
现在假设数据库有一张表
第一类数据丢失更新(lost )
在T1时刻开启了事务1,T2时刻开启了事务2,
在T3时刻事务1从数据库中取出了id=“"的数据,
T4时刻事务2取出了同一条数据,
T5时刻事务1将age字段值更新为30,
T6时刻事务2更新age为35并提交了数据
但是T7事务1回滚了事务age最后的值依然为20,事务2的更新丢失了,
这种情况就叫做"第一类丢失更新(lost )” 。
脏读(dirty read)
事务没提交,提前读取
如果第二个事务查询到第一个事务还未提交的更新数据,形成脏读
在T1时刻开启了事务1,T2时刻开启了事务2,
在T3时刻事务1从数据库中取出了id=“"的数据,
在T5时刻事务1将age的值更新为30,但是事务还未提

浅谈ACID 事务分析

文章插图
T6时刻事务2读取同一条记录,获得age的值为30,但是事务1还未提交
若在T7时刻事务1回滚了事务2的数据就是错误的数据(脏数据),
这种情况叫做” 脏读(dirty read)" 。
虚读( read)
在T1时刻开启了事务1,T2时刻开启了事务2,
T3时刻事务1从数据库中查询所有记录,记录总共有一条,
T4时刻事务2向数据库中插入一条记录,T6时刻事务2提交事务 。
T7事务1再次查询数据数据时,记录变成两条了 。
这种情况是"虚读( read)" 。
不可重复读( read)
在T1时刻开启了事务1,T2时刻开启了事务2,
在T3时刻事务1从数据库中取出了id=“"的数据,此时age=20,
T4时刻事务2查询同一条数据
T5事务2更新数据age=30,T6时刻事务2提交事务,
T7事务1查询同一条数据,发现数据与第一次不一致 。
这种情况就是"不可重复读( read)”
第二类丢失更新( lost )
- 覆盖丢失
在T1时刻开启了事务1,T2时刻开启了事务2,T3时刻事务1更新数据age=25,T5时刻事务2更新数据age=30
T6时刻提交事务,
T7时刻事务2提交事务,把事务1的更新覆盖了 。
这种情况就是"第二类丢失更新( lost )" 。
并发问题总结
不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现不一样了,
幻读的重点在于新增或者删除,同样的条件,第一次和第二次读取出来的记录不一样了
第一次更新丢失(回滚丢失)
第二次更新丢失(覆盖丢失)
【浅谈ACID 事务分析】隔离级别
在开发的时候一般需要设置隔离等级
数据库采用四种隔离等级
1.未提交读(read )
为最低事务隔离级别,一个事务能读取到别人未提交事务的未提交的更新事务,这种不安全,可能出现丢失更新,脏读,不可重复读,和幻读.
2.读已提交(read )
一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不会出现丢失更新,脏读,但可能出现不可重复读,和幻读
3读已提交( read)
保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务的影响,不会出现丢失更新,脏读,不可重复读,但可能出现幻读
4 序列化()
最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新,脏读,不可重复读,幻读,但是效率最低