mysql可重复读注意事项

本文探讨了数据库事务中不可重复读的现象及其在MySQL中的表现。基于维基定义,详细解释了在不同事务隔离级别下(如repeatable read)如何发生不可重复读,并通过具体示例对比了理论与MySQL实际行为之间的差异。

看一下维基关于不可重复读的定义:
在一次事务中,当一行数据获取两遍得到不同的结果表示发生了“不可重复读”. 在基于锁的并发控制中“不可重复读”现象发生在当执行SELECT 操作时没有获得读锁或者SELECT操作执行完后马上释放了读锁; 多版本并发控制中当没有要求一个提交冲突的事务回滚也会发生“不可重复读”现象。[1]

举个例子:
有一条记录id:1, name:L
事务A:

SET AUTOCOMMIT=0;
begin;
select * FROM test1 where id=1;

select * FROM test1 where id=1;
update test1 set name='a' where id=1;
commit;

事务B:

update test1 set name='b' where id=1;

先执行A的select,再执行B,再执行A的第二次select,update,然后提交事务。根据维基的定义:
在repeatable read 级别下事务B会被阻塞,直到事务A执行成功
但是mysql不是这样的,B事务不会被阻塞。mysql只保证第二次select同一条记录仍然是相同的值,但是事务B的更新不会被阻塞,不知道是不是mysql的实现不标准
多说一句,在serializable级别下B会被阻塞。

tips:
  • 设置事务隔离级别
    set session transaction isolation level REPEATABLE READ;
  • 查询事务隔离级别:
    select @@global.tx_isolation,@@tx_isolation;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值