今天小伙伴问了一个sql的问题:

  update t set status=2 where id in(select id from t where status=1)

这个sql,在并发的情况下,会不会有问题?

假设:下面的讨论,数据库的事务隔离级别是read_committed

其实这个可以很容易测试一下,得出结论:存在丢失更新的问题。

先来理解两个概念:

1. 一致性读

  当前的数据库产品级别都实现了多版本一致性,即MVCC,那么有了MVCC,数据库实现了读写互不阻塞的效果。
但为了达到read_committed事务隔离级别,以及语句级的读一致性,select语句需要构建一个版本,数据库会根据一个版本号,来构建。
比如oracle使用scn号,为了构建这个版本,产生的读,称为一致性读。

2. 当前读
  数据库在写入的过程中,比如update,因为要验证constraint,冲突等,需要读到当前数据,包括没有commit的事务,这样就产生了当前读。

oracle中英文解释:

  一致性读:  Consistent read

  当前读:  Current read

而上面的这个语句,就存在了两种读取。

  select: 会进行一致性读,
  update:会进行当前读。

而在并发的情况下: 第二个update可能因为更新到同一行(其他更新本行的事务未提交),而被阻塞。
当另一个事务提交后,第二个update会再次构建当前读,会把status从2再次更新成2.

如何避免:

1. 更改语句:
    update t set status=2 where id in(select id from t where status=1) and status=1;

2. 调整事务的隔离级别

转载于:https://www.cnblogs.com/xpchild/p/3798195.html

数据库 一致性读当前读相关推荐

  1. Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析

    Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析 在ORACLE数据库中有物理读(Physical Reads).逻辑读(Logical Reads).一致性读(Consistant Get ...

  2. Mysql-InnoDB 事务-一致性读(快照读)

    数据库读,是数据库操作中很常见的一个操作,在数据库事务中也经常出现读取数据的操作,比如先读取是否存在,然后不存在就插入等,想要了解数据库事务,理解"读"这个操作必不可少. 数据库读 ...

  3. mysql 虚读幻读区别,数据库基础知识

    MySQL事务 MySQL事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 作用:维护数 ...

  4. MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别

    目 录 1. 前 言 1.1 并发事务存在的问题 1.2 事务的隔离级别 1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别 2.1 读已提交下的幻读 2.2 可重复读下的幻读 2.2.1 情 ...

  5. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...

  6. 分布式mysql一致性问题_分布式缓存数据库一致性问题

    缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案. 缓存由于其高并发和高性能的特征,已经在项目中被广泛应用. 查询时一般先查询缓存,如果缓存命中的话,那么直 ...

  7. 好文推荐 | 缓存与数据库一致性问题深度剖析 (修订)

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:后端技术漫谈 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删 ...

  8. 缓存和数据库一致性问题,看这篇就够了

    作者 | Magic Kaito 来源 | 水滴与银弹 如何保证缓存和数据库一致性,这是一个老生常谈的话题了. 但很多人对这个问题,依旧有很多疑惑: 到底是更新缓存还是删缓存? 到底选择先更新数据库, ...

  9. Redis 缓存实战——缓存、数据库一致性问题分析与解决方案

    引言 缓存与数据库一致性的问题自从出现了缓存概念后就一直被提及,它是一个缓存方案的先天缺陷,只要存在缓存,就势必会讨论缓存与数据库一致性的问题. 一致性问题还广泛存在于各种分布式存储场景中,如主从一致 ...

  10. 故障分析:数据库一致性关闭缓慢问题诊断

    想必我们大家都知道,Shutdown immediate即一致性关闭数据库,数据库下次启动不需要做实例恢复即可open数据库.那么当数据库一致性关闭出现缓慢等状况时,该怎么办呢?那我们就来一起分析一下 ...

最新文章

  1. python刷题笔记怎么改_python面试题刷题笔记1 - 10
  2. windows系统下批量修改文件后缀
  3. 【PAT乙级】1063 计算谱半径 (20 分)
  4. fzu - Problem 1759 Super A^B mod C
  5. tensorflow随笔 -QueueRunner
  6. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题
  7. 媒体转码切片_cVideo云转码系统
  8. ping不同的网卡方法
  9. python参考手册下载_python3.8.4官方中文文档 API手册 PDF 高质量版
  10. python培训班靠谱吗-天津靠谱的python培训班
  11. 国外的一些开源网站汇集以及优秀博客的博客(非 CSDN的博客)
  12. Scoop包管理工具
  13. java kdj_基于java语言开发的个性化股票分析技术:随机指数(kdj).doc
  14. 计网复习day01 2020.8.18
  15. 赫赫有名的杰克·韦尔奇作为通用电气的CEO而享誉全球,他的管理特点就浓缩在这些言语之中,大家可以带着这些观点去读读他的自传和《赢》,吐血推荐哈。
  16. 获取手机联系人,并通过拼音字母快速查询
  17. 智能手机CPU大揭秘
  18. 托盘图标在资源管理器退出重启后图标消失(应用程序进程依然存在)的问题
  19. c# 多种方法调整屏幕亮度
  20. windows10本地部署PHP

热门文章

  1. 为什么个体户做不大?
  2. 我哥以前是做小本生意的,一年花销除外能存个十二万的样子
  3. 员工为什么缺乏执行力?
  4. 你根本就不需要认识这么多大佬
  5. 现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞后?
  6. sql server 内存_SQL Server内存性能指标–第3部分– SQL Server Buffer Manager指标和内存计数器
  7. 将PowerShell连接到SQL Server –使用其他帐户
  8. 单包攻击_SQL Server Integration Services 2016中的单包部署
  9. Python学习教程:Python3内置模块之base64编解码方法小结
  10. 1.yum下载 mysql及授权