autocommit=0引起的业务hang住

来源:互联网 发布:多益网络运营笔试题 编辑:程序博客网 时间:2024/04/30 02:26

在网上看了篇文章,不过感觉他的实验有些问题,自己重新测试了下,记录一下


session1 建表并插入数据:

create table if not exists t(id int primary key, c int);
set autocommit=0;
insert into t values(1,1);
insert into t values(2,2);
insert into t values(3,3);
commit;
select count(*) from t;

维持session1不断,新建一个连接session2,执行 alter table t add column name varchar(20);

此时该语句处于等待状态.


MySQL Tips: set autocommit=0是将本线程设置为非自动提交模式。在每个事务结束后,下个语句开始时自动新建一个事务。
这就意味着,session1最后的那个select count(*)操作,实际上之前隐含了一个begin操作。由于该事务没有提交,因此session1持有表t的MDL读锁。因此对于业务方的建议就是,及时提交这些读事务,或断开连接。
MySQL Tips: 连接断开时,MySQL会自动回滚当前未提交的事务。由于本case里面session1的最后一个事务只是一个select语句,因此回滚不影响业务。


0 0
原创粉丝点击