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   1450811640  阅读(958)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示