mysql事务并发更新金额
在此简单的记录一下,mysql的事务并发过程
首先创建一个parent表
1 2 3 4 5 6 | create table parent ( `id` int (10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID' , `value` varchar (32) NOT NULL DEFAULT '' COMMENT '钱' , PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=92616 DEFAULT CHARSET=utf8mb4 COMMENT= '事务测试表' ; |
1、通过事务A和事务B并发更新数据的某一行数据
左侧为事务A,右侧为事务B,首先读取到金额都是200原
在事务A中更新金额为210,在事务B中更新金额为220,当在A事务中提交了更新语句后,事务B中也触发更新操作,B事务中会触发获取锁失败的情况。
同时在事务A中获取金额为210,B事务中获取的金额为200(事务隔离)
然后提交A事务,并在事务B中更新金额为value+2,这时会发现B中金额并不是220,而是230,所以mysql中的更新操作必然会获取锁,获取到锁之后,读取当前行的最新版本,然后再执行写操作
2、直接更新数据库金额
开启事务A和事务B,获取到的金额为210元
在事务A中更新金额为300,事务B中更新金额为200,会触发事务获取锁失败
提交事务A,并在事务B将金额更新为200,事务B更新成功,
提交事务B,发现最终金额变为了200,造成了金额丢失
总结以上得出,数据库操作中,直接将金额更新为一个值是很危险的操作,因为这个值在当前事务操作的过程中可能已经被修改了,对于先读数据,然后更新值的场景一定要加锁
posted on 2022-01-11 21:01 1450811640 阅读(958) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix