• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

如何理解数据库事务隔离级别及脏读、不可重复读、幻读

mysql 搞代码 4年前 (2022-01-09) 57次浏览 已收录 0个评论
文章目录[隐藏]

本篇文章给大家带来的内容是关

本文来源gao!%daima.com搞$代*!码网1

于如何理解数据库事务隔离级别及脏读、不可重复读、幻读,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、数据库事务正确执行的四个基本要素

1.1ACID原则。

  ACID原则是数据库事务正常执行的四个基本要素,分别指原子性、一致性、独立性及持久性。

  事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了,比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱。不可能划了卡,而钱却没出来,这两步必须同时完成.要么就不完成。

  事务的一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。或者说,A给B转账300元钱,那么A的账户就必须是减少300元钱,B的账户就必须是增加300元钱,不能说是增加或减少了如200元钱等,这里符合事务的原子性,但是不符合事务的一致性。往实际业务中没有这么简单,往是类似买东西扣库存这类的逻辑,主表里有库存,库存表里有库存,SKU表里还有,然后就因为设计缺陷,就算加了事务还是出现了超卖、SKU库存对不上总库存的问题,这个就是一致性不满足的了。

  独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态,因为这样可能会导致数据不一致。

  持久性(Durability):一旦事务提交或者回滚,这个状态都要持久化到数据库中,不考虑隔离性会出现的读问题。


1.2脏读、不可重复读,幻读。

  脏读(Dirty read):在一个事务中读取到另一个事务没有提交的数据。例如,当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

  不可重复读(NonRepeatable Read):既不能读到相同的数据内容。是指在一个事务内,多次读同一数据,在这个事务还没有结束时,另外一个事务也访问该同一数据并且修改,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。

  幻读(Phantom Read):在一个事务中,两次查询的结果不一致(针对的insert操作) 。是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
  例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。


二、数据库事务隔离级别

  数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交)、Read committed(读提交) 、Repeatable read(可重复读)、Serializable(序列化),这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何理解数据库事务隔离级别及脏读、不可重复读、幻读

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址