看到一个MySQL面试题,关于隔离级别,读未提交(Read uncommitted)的一个使用场景。
原始问题如下:
业务通过一个大事务在插入一批非常大的数据,这个事务已经执行了很长时间,没有提交,如何知道当前已经插入了多少条数据?
估计很少有人会想到使用读未提交隔离级别来解决这个问题。不过思路确实很新颖,因为通常情况下,读未提交,以及串行读这两个隔离级别在正常的业务场景下,都不会使用,似乎数据库对这两个隔离级别功能的实现有点多余,只是为了满足事务隔离性理论的完整性,实际生产环境几乎没有人会用。
下面我们来验证一下,读未提交隔离级别是否真的能解决上面的那个问题。
验证的MySQL版本:5.7.19
session1 | session2 | 备注 |
---|---|---|
begin; | ||
insert into tb values(1,'1'); | ||
select * from tb; | 查不到数据 | |
set tx_isolation='read-uncommitted'; | 设置隔离级别为读未提交 | |
select * from tb; | 查到了session1未提交的数据 |
经过验证,确实能够通过设置隔离级别为读未提交,来检查insert大事务的进度。