先看看问题场景

某些业务需要更新某一个表的多个字段,很可能更新的结果跟理想值不一致。简单来讲就是执行类似下面的sql会出什么结果?

update test set a = a+1,b=a+1 where id =2

我们来模拟一下上面的sql环境,我们创建一个test表,并使用innodb存储引擎。

create table test (id int,a int,b int,primary key(id));

增加三行数据

insert into test values (1,10,100),(2,20,200),(3,30,300)

进行修改多个字段

update test set a = a+1,b=a+1 where id =2

修改的条件是id=2,为啥修改的结果是(2,21,22),不应该是(2,21,21)吗?是不是很多人以为修改的结果是(2,21,21),是不是感觉数据是乱的,如果数据少,改回去还算省事,关键数据量很多,改的工作量就大了,还容易出错。

原因分析

因为 update 是当前读,读取的是记录数据的最新版本,

update test set a = a+1,b=a+1 where id =2

update a=a+1 因为要做当前读 现在a =20 +1 后 a=21 ,保证最新值,再做 b=a+1
也需要读到a值的最新的值 还要加锁, 现在a的值已经变成21, 再加1就变成22,

那么如果我想按照我们的理想值更新出结果,那要怎么做呢?

问题解决

可以把 a 列暂存在一个临时变量里

select a into @a from test where a=2;

再执行修改

update test set a=@a+1,b=@a+1 where a=@a;

结果就会是(2,21,21)了

总结一下

  • 快照读

执行select的时候,innodb默认会执行快照读,快照读,也就是读取快照的数据,数据虽然是一致的,但是数据是历史数据。

快照读:只是简单的 select ,不包括 select … lock in share mode, select … for update

  • 当前读

当你执行这几个操作的时候默认会执行当前都会加锁,也就是会读取最新的记录,也就是别的事务提交的数据你也可以看到。

update 执行当前读,然后把返回的数据加锁,之后执行update。

加锁是防止别的事务在这个时候对这条记录做什么,默认加的是排他锁,也就是只允许读,其他都不可以,这样就可以保证数据不会出错了。

sql怎么读_mysql由于快照读,造成数据混乱,该如何解决相关推荐

  1. mysql数据库出现幻读_MySQL中幻读和幻读存在的问题

    1.概念 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行. 可以看到,session A里执行了三次查询,分别是Q1.Q2和Q3.它们的SQL语句相同,都是s ...

  2. mysql 一致性读_MySQL半一致性读原理解析-从源码角度解析

    1.什么是半一致性读 A type of read operation used for UPDATE statements, that is a combination of read commit ...

  3. mysql 查询两表 两列 比较大小写_mysql 查询表中列的数据不区分大小写的解决

    mysql查询默认是不区分大小写的 如: select * from some_table where str='abc'; select * from some_table where str='A ...

  4. mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读

    什么是可重复读 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到 ...

  5. mysql快照读取_MySQL 快照读和当前读

    在MySQL读取数据时可以按照是否使用一致性非锁定读来分为快照读和当前读: 1.快照读:MySQL使用MVCC (Multiversion Concurrency Control)机制来保证被读取到数 ...

  6. MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开lock和latch ...

  7. 【MySql:当前读与快照读】

    当前读与快照读 MVCC (Multi-Version Concurrency Control) (基于锁的并发控制,Lock-Based Concurrency Control).MVCC最大的好处 ...

  8. Mysql的快照读和当前读

    当前读 读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加 锁.对于我们日常的操作,如:select ... lock in share mode(共享锁),se ...

  9. mysql 什么是幻读_Mysql中的幻读(一)

    什么是幻读 幻读表示的是在一个事物里面 同一个select语句,前后两次查询出来的结果是不相同的,需要注意的一点是,在InnoDB里面,幻读跟事物的隔离级别有关,更加准确的说是跟一个事物的快照和当前读 ...

最新文章

  1. 6s如何无线连电脑连接服务器,iPhone 6s无线连接能力:WiFi与4G大提速
  2. delete []实现机制
  3. golang 函数结束后 goroutine退出机制
  4. ajax 传递参数中文乱码解决办法
  5. ArcGIS,Envi软件中的卷帘工具使用及对比
  6. 学习5g通信心得体会_5G,不仅仅是速度,更可能是改变命运的机会
  7. 第八届蓝桥杯第二题等差素数列
  8. HDOJ 3507 Print Article(DP + 斜率优化)
  9. 【leetcode】二叉树(python)
  10. 20170923在线编程之输入年、月、日输出这是一年的第几天
  11. python实现Kruskal算法求解加权图中最小生成树问题
  12. 最近win7更新后出现第二次打开IDE(delphi2007)的时候提示无法打开EditorLineEnds.ttr这个文件...
  13. 重新编译tensorflow源代码遇见的问题解决方法
  14. 市场调研报告-全球与中国船用下水推车市场现状及未来发展趋势
  15. 怎么将png图片缩小?教你在线压缩png图片的方法
  16. 电信保温杯笔记——《统计学习方法(第二版)——李航》第16章 主成分分析
  17. call指令和ret指令【笔记+详解】
  18. 免费的视频压缩软件,踩了好多坑之后,终于找到了——Handbrake
  19. PATA 题解 1002
  20. 区块链报错 5 | Contract has not been deployed to detect network (network/artifact mismatch)

热门文章

  1. Java Scala获取所有注解的类信息
  2. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型
  3. 2018 ACM-ICPC World Finals - Beijing F.Go with the Flow
  4. 数论基础之组合数计数问题
  5. 更换已存在项目的svn的地址
  6. 初识Firebug 全文 — firebug的使用
  7. 什么是Web Service
  8. C++中 类与类之间的关系
  9. 大数据之-Hadoop优势_(4高)---大数据之hadoop工作笔记0011
  10. Linux多线程工作笔记0003---C语言中%p,%u,%lu都有什么用处