千家信息网

MySQL并发更新数据时的处理方法

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,UPDATE是否会加锁?SQL语句为如下时,是否会加锁?UPDATE table1 SET num = num + 1 WHERE id=1;答案是不会实际上MySQL是支持给数据行加锁(InnoDB
千家信息网最后更新 2025年11月08日MySQL并发更新数据时的处理方法

UPDATE是否会加锁?

SQL语句为如下时,是否会加锁?

UPDATE table1 SET num = num + 1 WHERE id=1;

答案是不会

实际上MySQL是支持给数据行加锁(InnoDB)的,并且在UPDATE/DELETE等操作时确实会自动加上排它锁。只是并非只要有UPDATE关键字就会全程加锁,针对上面的MySQL语句而言,其实并不只是一条UPDATE语句,而应该类似于两条SQL语句(伪代码):

a = SELECT * FROM table1 WHERE id=1;UPDATE table1 SET num = a.num + 1 WHERE id=1;

其中执行SELECT语句时没有加锁,只有在执行UPDATE时才进行加锁的。所以才会出现并发操作时的更新数据不一致。原因找到了,解决问题就不远了。而针对这类问题,解决的方法可以有2种:

  • 通过事务显式的对SELECT进行加锁
  • 使用乐观锁机制

SELECT显式

加锁对SELECT进行加锁的方式有两种,如下:

SELECT ... LOCK IN SHARE MODE  #共享锁,其它事务可读,不可更新SELECT ... FOR UPDATE    #排它锁,其它事务不可读写

如果你不使用这2种语句,默认情况下SELECT语句是不会加锁的。并且对于上面提到的场景,必须使用排它锁。另外,上面的2种语句只有在事务之中才能生效,否则不会生效。在MySQL命令行使用事务的方式如下:

SET AUTOCOMMIT=0; BEGIN WORK;  a = SELECT num FROM table1 WHERE id=2 FOR UPDATE;  UPDATE table1 SET num = a.num + 1 WHERE id=2; COMMIT WORK;

这样只要以后更新数据时,都使用这样事务来进行操作;那么在并发的情况下,后执行的事务就会被堵塞,直到当前事务执行完成。(通过锁把并发改成了顺序执行)

使用乐观锁

乐观锁是锁实现的一种机制,它总是会天真的认为所有需要修改的数据都不会冲突。所以在更新之前它不会给数据加锁,而只是查询了数据行的版本号(这里的版本号属于自定义的字段,需要在业务表的基础上额外增加一个字段,每当更新一次就会自增或者更新)。

在具体更新数据的时候更新条件中会添加版本号信息,

  • 当版本号没有变化的时候说明该数据行未被更新过,并且也满足更新条件,所以会更新成功。
  • 当版本号有变化的时候,则无法更新数据行,因为条件不满足,此时就需要在进行一次SQL操作。(重新查询记数据行,再次使用新的版本号更新数据)

实践

对 for update上锁进行一次实践一个student表,其中有一条数据

开启两个client

第一个开启事务后执行

select name from student where id = 1 for update;

第二个开启事务后执行相同的语句,发现该条数据被第一个事务上锁阻塞了

这时候第一个事务执行修改并commit;

第二个事务的select执行,发现阻塞了4秒多

小结

总的来说,这2种方式都可以支持数据库的并发更新操作。但具体使用哪一种就得看实际的应用场景,应用场景对哪种支持更好,并且对性能的影响最小。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

更新 数据 事务 语句 版本 支持 乐观 只是 场景 方式 时候 条件 只有 字段 实际 情况 机制 问题 面的 变化 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机三级网络技术备考措施 信息与网络安全法律有哪些 多维数据库性能提升技术 中山跑腿app软件开发费用 网络安全应急演练方案及记录 网络安全法有奖知识问答 分布式数据库可以做数据同步 口袋之旅服务器火爆怎么进 美国文化产品数据库 北京软件开发者多少钱 开源视觉软件开发平台 求职无忧网络技术上海有限公司 游戏世界服务器地址 工业能源管理系统软件开发服务商 河北旧服务器回收云主机 软件开发建模方法有哪些 网络安全观的表述有 联想刀片服务器cmm管理工具 南京智能软件开发服务电话 网络安全应急指挥中心忙么 战舰世界连不上服务器是什么原因 搭建网络缓存服务器 天龙八部游戏新开服务器 游戏数据库ppt 加强全体员工网络安全意识 数据库中的数据长度指什么 进销存管理软件开发设计 技校有软件开发吗 复旦大学图书馆电子数据库 净网2018网络安全吗
0