在此简单的记录一下,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原

 

mysql金额格式化 mysql 金额_更新数据

 

在事务A中更新金额为210,在事务B中更新金额为220,当在A事务中提交了更新语句后,事务B中也触发更新操作,B事务中会触发获取锁失败的情况。

同时在事务A中获取金额为210,B事务中获取的金额为200(事务隔离)

mysql金额格式化 mysql 金额_更新数据_02

 

然后提交A事务,并在事务B中更新金额为value+2,这时会发现B中金额并不是220,而是230,所以mysql中的更新操作必然会获取锁,获取到锁之后,读取当前行的最新版本,然后再执行写操作

mysql金额格式化 mysql 金额_mysql_03

 

 

 

2、直接更新数据库金额

 

开启事务A和事务B,获取到的金额为210元

mysql金额格式化 mysql 金额_mysql_04

 

在事务A中更新金额为300,事务B中更新金额为200,会触发事务获取锁失败

mysql金额格式化 mysql 金额_mysql金额格式化_05

 

提交事务A,并在事务B将金额更新为200,事务B更新成功,

mysql金额格式化 mysql 金额_mysql金额格式化_06

 

提交事务B,发现最终金额变为了200,造成了金额丢失

mysql金额格式化 mysql 金额_mysql_07

 

 

总结以上得出,数据库操作中,直接将金额更新为一个值是很危险的操作,因为这个值在当前事务操作的过程中可能已经被修改了,对于先读数据,然后更新值的场景一定要加锁