聊聊sql的并发update

本文主要简述一下不同sql语句并发update的情况。

指定主键update

update tableA set owner = ? where id = ?

这种情况下,并发执行,最后执行的覆盖掉前面执行的

指定主键和版本号

update tableA set owner = ? where id =? and version = ?

这种带有版本号或时间戳的,属于乐观锁方案,并发执行的sql,最先到的执行完之后,版本号发生变化,同一时刻并发的同版本号的update语句由于版本号对不上则无法udpate成功

指定主键及与更新字段相关的条件

update tableA set owner = ? where id = ? and owner =?

先到的sql先执行,而且owner发生变化,安排到后执行的sql,由于owner发生变化,则未能执行成功

更新值与原值相关

update tableA set totalNum = totalNum + ? where id = ?

这个语句并发执行,最终在db那里还是会转化为串行,然后加锁进行,最后的效果类似atomic integer的incr。

相当于如下:

1) open a transaction
2) fetch the data (SELECT totalNum FROM tableA WHERE id = ?;)
3) do your work (totalNum + amount)
4) update the data (UPDATE tableA SET totalNum = ? WHERE id = 1;)
5) commit

第一个update会持有id=?这行记录的排它锁,第二个update需要持有这个记录的排它锁的才能对他进行修改,第二个update阻塞直到第一个update提交成功,他才会获得这个锁,从而对数据进行修改。

doc

  • How to deal with concurrent updates in databases?
  • MYSQL-Innodb下,update的并发是否会产生脏数据?
  • SQL处理并发之乐观锁

原文发布于微信公众号 - 码匠的流水账(geek_luandun)

原文发表时间:2017-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禁心尽力

关于事务

何为事务? 1.事务是指事务开始到事务结束之间的一组sql语句的操作单元,并且是组内所有sql语句共同完成的业务逻辑。 2.要想使用事务,首先关闭系统自动提交功...

20850
来自专栏开源优测

性能测试必备监控技能MySQL篇15

前言 性能测试过程中,数据库相关指标的监控是不可忽视的,在这里我们就MySQL的监控配置及重点涉及性能的一些参数进行说明。 在笔者的日常性能测试过程中,重点关注...

381120
来自专栏Linux运维学习之路

mysql存储引擎、事务

MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制。 文件系统是一种软件。 文件系统类型 ext2  ext3  ext4  xfs 数据 不管...

433140
来自专栏杨建荣的学习笔记

MySQL中的事务和锁简单测试(r10笔记第46天)

一直以来,对于MySQL中的事务和锁的内容是浅尝辄止,没有花时间了解过,在一次看同事排查的故障中有个问题引起了我的兴趣,虽然过去了很久,但是现在简单总结一下还是...

35770
来自专栏决胜机器学习

《高性能MySQL》读书笔记(二) ——MySQL存储引擎概述

《高性能MySQL》读书笔记(二)——MySQL存储引擎概述 (原创内容,转载请注明来源,谢谢) 一、基础信息 mysql将数据库保存在数据目录下...

41850
来自专栏杨建荣的学习笔记

由小见大-MySQL脚本部署中的一些策略

在线上环境中部署脚本,可谓是常在河边走,哪有不湿鞋,所以大大小小的案例总结下来,还是会发现一些有趣的地方,这些可以作为操作时的一些参考,仅供参考而已。 第一类...

35360
来自专栏沃趣科技

“mysqlbinlog”工具做binlog server靠谱吗?

玩过binlog server的同学都知道,它使用mysqlbinlog命令以daemon进程的方式模拟一个slave的IO线程与主库连接,可以很方便地即时同...

58680
来自专栏Golang语言社区

Go语言的单例模式(Singleton)

单例模式(Singleton):表示一个类只会生成唯一的一个对象。单例模式具有如下性质: A.这些类只能有一个实例; B.这些能够自动实例化; C.这个...

44650
来自专栏跟着阿笨一起玩NET

SQL2000自动备份 压缩 删除(备份文件)

create proc dbbf_test as declare @dbname varchar(20), @cmd1 nvarchar(120), ...

32210
来自专栏MYSQL轻松学

MYSQL数据闪回方式

MYSQL官方截止目前还没有出来数据闪回特性,也许后续版本会出现。社区有一些开源工具可以使用,沿用的基本都是彭立勋最早提出的思路,利用binlog对SQL进行反...

46280

扫码关注云+社区

领取腾讯云代金券