排版问题可转移到我的公众号查看:
我们主要是看下,当在可重复读的事务级别的情况下,多个事务间的修改和查询结果关系\
一、我们先查看下Mysql默认事务隔离级别
我们打开mysql命令行工具输入以下命令,看到默认的是可重复读事务级别
二、环境准备并操作
我这里打开3个数据库连接,在前2个连接中会开启事务,第3个连接没事务,我们这里借用rowversion字段来测试,也就是事务外的操作,我这里录制了视频,如下:
视频加载失败,请刷新页面重试
表结构sql如下:
CREATE TABLE student6 (
Id int NOT NULL AUTO_INCREMENT,
RowVersion int NOT NULL,
Name varchar(45) DEFAULT NULL,
Time datetime DEFAULT NULL,
PRIMARY KEY (Id),
UNIQUE KEY uk_student6_rowversion_name (RowVersion,Name)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
所有相关sql如下,你们可以根据自己的情况可以调整先后顺序:
select * from test.student6 ;
START TRANSACTION;
select * from test.student6 where id=3;
update test.student6 set rowversion=rowversion-1 where id=3 and rowversion>0;
select * from test.student6 where id=3;
commit;
select * from test.student6 where id=3;
SELECT @@tx_isolation
\
 **三、结论**
1)Mysql数据库默认事务隔离级别是可重复读
2)在事务可重复读的情况下,比如有事务1和事务2,事务1执行修改操作事务未提交时的结果,在事务1内部是可见的,而在事务2或事务外是不可见的,所以这里告诉我们其他事务不能依靠先查出来的结果来校验是否能操作,好在我们这里的修改操作的条件是放在update语句里面。
3)这时事务2执行同样的操作时,会进行等待,当等待超时,则返回失败;当等待未超时,且这时事务1提交了,这时事务2会根据update修改语句的修改条件返回成功修改的行数,这里应该返回0行,因为根据修改条件是没有满足修改条件的数据,进而也能推理出:在事务2内修改操作的条件的判断,是要等到其他事务修改操作提交后拿这最新的提交数据再到事务2内的修改操作条件中进行比较,进行就不会出现超减的情况,这在电商并发情况下的防止超卖很关键。