在此简单的记录一下,mysql的事务并发过程
首先创建一个parent表
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,造成了金额丢失
总结以上得出,数据库操作中,直接将金额更新为一个值是很危险的操作,因为这个值在当前事务操作的过程中可能已经被修改了,对于先读数据,然后更新值的场景一定要加锁