mysql 中阻塞讲解

因为不同锁之间的兼容关系,在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源,这就是阻塞,阻塞并不是一件坏事,其是是为了确保事务可以并发且正常的运行。

在InnoDB存储引擎中,参数innodb_lock_wait_timeout 用来控制等待时间(默认是50秒),

innodb_rollback_on_timeout 用来设定释放在等待超时时对进行中的事务进行回滚操作(默认是OFF ,代表不回滚)。参数innodb_lock_wait_timeout是动态的,可以在mysql数据库运行时进行调整:

set @@innodb_lock_wait_timeout=60;

而innodb_rollback_on_timeout 是静态的,不可在启动时进行修改如:

set @@innodb_rollback_on_timeout=on;
Error Code: 1238. Variable 'innodb_rollback_on_timeout' is a read only variable
当发生超时时候,MySQL数据库会抛出一个1205错误如:
ERROR 1205( HY000): Lock wait timeout exceeded; try restarting transaction

需要注意,默认情况下不会回滚超时引发的错误异常,mysql innodb引擎大部分情况下不会对异常进行回滚,比如

会话A:

SELECT* FROM t;
+---+ 
| a|
 +---+ 
| 1| 
| 2| 
| 4| 
+---+
beign;
select * from t where a<4 for update;
+---+ 
| a|
 +---+ 
| 1| 
| 2| 
+---+
会话B:

 begin;
 insert into t select 5;
 insert into t select 3;

我们看到会话A锁定了1和2,同时会上一个区间锁 将(2,4)锁定, 会话B中插入5是不收阻塞的,但后边插入3会被会话A阻塞住,会话B会抛出异常,同时会话B是不会回滚的,因此用户需要自己判断是否需要commit还是rollback,之后在进行下一步操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄奋斗程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值