脏读、幻读、不可重复读和丢失更新实例

2017年6月5日,天气——雨。

      前两天整理之前的学习笔记时,发现对事务并发产生的问题——脏读幻读不可复读丢失更新这些概念有点模糊,于是又重新温习了一遍,现在把自己的一些理解归纳整理如下,方便大家学习。

       锁就是防止其他事务访问指定资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。 一般来说,锁可以防止脏读、不可重复读和幻读。

1.脏读(Dirty Read)——一个事务读取到了另外一个事务没有提交的数据。

详细解释:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

事务T1:更新一条数据
          –>事务T2:读取事务T1更新的记录
 事务T1:调用commit进行提交
 此时事务T2读取到的数据是保存在数据库内存中的数据,称为脏数据,这个过程称为脏读。

脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。

解决脏读问题:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事务操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更无权参与进来读写,这样就防止了脏读问题。但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。

2.幻读(Phantom——同一事务中,用同样的操作读取两次,得到的记录数不相同。 

详细解释:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

事务T1:查询表中所有记录
          –>事务T2:插入一条记录
          –>事务T2:调用commit进行提交
事务T1:再次查询表中所有记录
            
此时事务T1两次查询到的记录是不一样的,称为幻读。

注意:幻读重点在新增或删除。

幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。

发生的情况:没有范围锁。

如何避免:实行序列化隔离模式,在任何一个低级别的隔离中都可能会发生。

解决幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻读问题。

3.不可重复读(Nonrepeatable Read)——在同一事务中,两次读取同一数据,得到内容不同。

事务T1:查询一条记录
         –>事务T2:更新事务T1查询的记录
         –>事务T2:调用commit进行提交
事务T1:再次查询上次的记录
            
此时事务T1对同一数据查询了两次,可得到的内容不同,称为不可重复读。

注意:不可重复读重点在修改。

在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。

在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。

有两个策略可以防止这个问题的发生:

(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。

(2) 而在多版本并行控制中,事务2可以被先提交,而事务1继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功;如果不是,事务1会被回退。

解决不可重复读问题:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。
4.丢失更新(Lost Update) 

事务T1读取了数据,并执行了一些操作,然后更新数据。事务T2也做相同的事,则T1和T2更新数据时可能会覆盖对方的更新,从而引起错误。

5.处理以上隔离级别的问题,采用如下方法:

  事务隔离五种级别:
        (1)TRANSACTION_NONE  不使用事务。
        (2)TRANSACTION_READ_UNCOMMITTED  允许脏读。
        (3)TRANSACTION_READ_COMMITTED  防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。
        (4)TRANSACTION_REPEATABLE_READ  可以防止脏读和不可重复读。
        (5)TRANSACTION_SERIALIZABLE  可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。

  以上的五个事务隔离级别都是在Connection接口中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。

  如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。

  注意:事务的隔离级别受数据库的限制,不同的数据库支持的的隔离级别不一定相同。

 

 

以上就是脏读、幻读、不可重复读和丢失更新实例的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1620408.html

(0)
上一篇 2025年2月19日 00:57:24
下一篇 2025年2月19日 00:57:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 数据库的脏读、不可重复读、幻读

    数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。脏读、不可重复读、幻读的级别高低是:脏读 数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID):原子…

    数据库 2025年2月22日
    100
  • 一个事务复制的bug–更新丢失 续

    阅读本文之前请参考 最近又做了一个case,环境是sql server 2008 R2. 客户添加了一个’replication support only’的订阅,之后发现现存订阅出现了更新丢失。 丢失的数据恰巧是添…

    数据库 2025年2月22日
    100
  • 2023年中考可以复读吗

    中考是一年之中比较重要的一次考试,也是比较盛大的一次考试。每年中考的时候都会有很多新的政策,今年中考进行改革,学生的升学率是比较低的,如果考不上或者没考好的学生,一般是不能进行复读的。 2023年中考可以复读吗 严格意义上来说是不可以复读的…

    2025年2月21日
    397.7K00
  • 2023年高考生可以复读吗

    高考是一年之中比较重要的一次考试,并且也是全国统一的一次考试,各个地方对高考会有不同的政策规定,根据最新的规定显示,很多地方的公办高中不招收复读生,但是可以去私立高中复读,所以2023年还是可以复读的。 2023年高考生可以复读吗 复读一直…

    2025年2月21日
    803.3K00
  • PHP文件在Apache服务器中丢失的问题

    PHP文件在Apache服务器中丢失的问题,需要具体代码示例 在Web开发过程中,经常会遇到PHP文件在Apache服务器中丢失的问题。这种问题可能由于配置错误、权限问题或其他原因导致,给开发带来不便。本文将介绍PHP文件丢失的可能原因,并…

    2025年2月20日
    100
  • 织梦CMS验证码丢失怎么办?

    《织梦CMS验证码丢失怎么办?》 在使用织梦CMS搭建网站过程中,验证码是用来确保网站安全性和防止恶意攻击的重要工具。然而有时候,用户可能会遇到验证码丢失的问题,导致无法正常进行网站操作。这时候,我们需要进行一些调整和修复来解决这一问题。 …

    2025年2月20日
    300
  • 织梦CMS文章内容丢失?一招搞定

    织梦CMS(DedeCMS)是一款功能强大的开源网站内容管理系统,深受广大网站建设者的喜爱。然而,在使用过程中,有时候会出现文章内容丢失的情况,这给网站管理者带来了不小的困扰。本文将介绍一种解决织梦CMS文章内容丢失问题的方法,同时提供具体…

    2025年2月20日
    300
  • 幻读和不可重复读区别

    幻读和不可重复读的区别 1) “不可重复读” 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到…

    2025年2月19日
    100
  • 幻读和不可重复读有什么区别

    区别: 不可重复读:同样的条件下,读取过的数据,当我们再次读取时值发生了变化。 幻读:同样的条件下,第1次和第2次读出来的记录数不一样。 具体分析: 1、不可重复读 同样的条件下,读取过的数据,当我们再次读取时值发生了变化。 例子: 在事务…

    2025年2月19日
    100
  • 示例MySQL事务隔离级别以及脏读、幻读、不可重复读

    推荐(免费):mysql视频教程 事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。每个客户端都可以在自己的会话中…

    2025年2月19日
    100

发表回复

登录后才能评论