首页 >> 大全

浅谈ACID 事务分析

2023-08-26 大全 25 作者:考证青年

浅谈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,但是事务还未提

_事务分析例题_简述事务分析

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 )"。

并发问题总结

不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现不一样了,

幻读的重点在于新增或者删除,同样的条件,第一次和第二次读取出来的记录不一样了

第一次更新丢失(回滚丢失)

第二次更新丢失(覆盖丢失)

隔离级别

在开发的时候一般需要设置隔离等级

数据库采用四种隔离等级

1.未提交读(read )

为最低事务隔离级别,一个事务能读取到别人未提交事务的未提交的更新事务,这种不安全,可能出现丢失更新,脏读,不可重复读,和幻读.

2.读已提交(read )

一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不会出现丢失更新,脏读,但可能出现不可重复读,和幻读

3读已提交( read)

保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务的影响,不会出现丢失更新,脏读,不可重复读,但可能出现幻读

4 序列化()

最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新,脏读,不可重复读,幻读,但是效率最低

不可重复读对应的表的操作是更改(),而幻读对应的表的操作是插入(),两种的应对策略不一样,对于不可重复读,只需要采用行级锁防止该记录被更新即可,而对于幻读必须加个表级锁,防止在表中插入数据

欢迎一起交流一起学习

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了