数据库 事务隔离级别之可重复读

通过下面的sql语句,在sql客户端查询可以获取数据库的事务隔离级别;

show variables like '%isolation%';

 查看全局事务隔离级别和session事务隔离级别(mysql8)

 select @@global.transaction_isolation, @@transaction_isolation;

mysql8以下 

select @@global.tx_isolation, @@tx_isolation;

 mysql默认隔离级别是可重复读,如下图:

下面先介绍事务的隔离级别:
可重复读:在同一事物中不修改数据的情况下, 前后读取的数据是一致的,且当前事物中在没有提交的情况下不能读取其他事物中提交或未提交的数据,下面通过一个例子介绍一下什么叫可重复读。

我们先在navicat 开启两个查询窗口(后面称为窗口1,窗口2),一个查询窗口就是一个会话事务。

我们在1窗口中开启事务

start TRANSACTION ; 

 然后执行查询语句

select * from buyer where user_id =1 ;
select * from  buyer where user_id = 2 ; 

 我们发现user1和user2的babancle都是1000 ,然后我们执行给user1减1块钱,给user2加一块钱操作。

update buyer set balance = balance-1 where user_id = 1 ;
update buyer set balance = balance+1 where user_id = 2 ;

 然后在窗口1中再次查询user1和user2的babancle 结果如下:
 user1:

user2:

我们发现在窗口1中查询到的user1和user2的babancle已经发生了改变。

然后我们打开窗口2, 在窗口2中执行查询操作。

select * from buyer where user_id =1 ;
select * from  buyer where user_id = 2 ;

 

发现查询结果还是1000元。

然后在窗口1中执行commit操作,提交窗口1中的转账操作。

COMMIT ; 

再次在窗口2中执行查询操作,发现已经变成更新后的值。

下面解释为什么会这样。

 首先窗口1开启了事物,并且对数据做了修改,但是并没有执行commit操作,mysql默认的事物隔离级别是 REPEATABLE-READ ,可重复读,窗口2中不能读取到窗口1中未提交的数据,所以读取到的数据依然初始数据。这就是可重复读。

假如我们在窗口2中开启事物,执行顺序修改为,窗口1开启事物,窗口2开启事物,窗口1执行更新操作,窗口1执行commit操作,窗口2执行查询操作,这时发现,窗口2查到的并不是修改后的数据,而是初始数据,那是因为在在窗口2开启事物的时候,数据的数据并没有发生改变,所以在可重复读隔离级别中。在同一事物中在不修改数据的情况下,前后读取到的结果应该是一致的。

综上验证事物隔离级别:可重复读

总结:可重复读:在当前事物中,如果不发生修改操作,则在该事物中前后读取到的数据应该是一致的,且不会读取到其他事物中提交或未提交的数据。

原文地址:https://www.cnblogs.com/wenq001/p/10098002.html