autocommit=0引起的业务hang住

本文通过实测展示在数据库操作中设置非自动提交模式(setautocommit=0)的效果,阐述了如何通过及时提交读事务或断开连接来优化数据库性能,并解释了连接断开时自动回滚未提交事务的机制。

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


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语句,因此回滚不影响业务。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值