关于innodb_rollback_on_timeout测试
innodb_rollback_on_timeout
innodb_lock_wait_timeout
最开始看到innodb_rollback_on_timeout 时,没有好好理解transaction timeout的意思.以为只要是连接超时就会触发,今天研究了一下.只能说巨坑;
以下测试.隔离级别皆为RR模式.测试过程.
实验一:
innodb_rollback_on_timeout =on
innodb_lock_wait_timeout=20
---------------------------------------|----------------------------------------|------------------------------------------------
session 1 | session 2 | session 3
---------------------------------------|----------------------------------------|------------------------------------------------
begin; | |select * from information_schema.innodb_trx
| | order by trx_started;
---------------------------------------|----------------------------------------|------------------------------------------------
insert into t8 values (20,'ddd'); | | 1
---------------------------------------|----------------------------------------|------------------------------------------------
| begin; | 2
---------------------------------------|----------------------------------------|------------------------------------------------
| update t8 set test1='yyy' where id =19;| 2
---------------------------------------|----------------------------------------|------------------------------------------------
| | 2
update t8 set test1='xxx' where id =19;| |
---------------------------------------|----------------------------------------|------------------------------------------------
堵塞 | | 2
---------------------------------------|----------------------------------------|------------------------------------------------
20s后超时 | | 1
事务结束; | commit; | 0
---------------------------------------|----------------------------------------|------------------------------------------------
select * from t8;
20这个id没有;19被改为yyy;
实验二:
innodb_rollback_on_timeout =off
innodb_lock_wait_timeout=20
---------------------------------------|---------------------------------------|-----------------------------------------------
session 1 | session 2 | session 3
---------------------------------------|---------------------------------------|-----------------------------------------------
begin; | | select * from information_schema.innodb_trx
| | order by trx_started;
---------------------------------------|---------------------------------------|-----------------------------------------------
insert into t8 values (20,'ddd'); | | 1
---------------------------------------|---------------------------------------|-----------------------------------------------
| begin; | 2
|update t8 set test1='yyy' where id =19;|
---------------------------------------|---------------------------------------|-----------------------------------------------
update t8 set test1='xxx' where id =19;| | 2
---------------------------------------|---------------------------------------|-----------------------------------------------
堵塞 | | 2
---------------------------------------|---------------------------------------|-----------------------------------------------
20s后超时 | | 2
事务未结束 | |
---------------------------------------|---------------------------------------|-----------------------------------------------
commit; | commit; | 0
---------------------------------------|---------------------------------------|-----------------------------------------------
select * from t8;
20这个id存在;19被改为yyy;
结果就是:如果innodb_rollback_on_timeout 为on,事务在innodb_lock_wait_timeout超时后,当前sql会报超时,并使整个事务都回滚,然后结束事务;
如果innodb_rollback_on_timeout 为off(默认值),事务在innodb_lock_wait_timeout超时后,当前sql会超时,并终止,回滚当前sql,但整个事务不回滚,事务不结束,必须显示的回滚或提交;
一句话:innodb_rollback_on_timeout 没什么卵用.纯碎就是坑;
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341