Lock wait timeout exceeded; try restarting transaction

当两个事务尝试更新同一记录时,如果其中一个事务长时间未提交,会导致另一个事务等待超时,出现'Lock wait timeout exceeded; try restarting transaction'异常。解决方法包括通过show processeslist kill掉进程或查询information_schema库中的innodb_trx、innodb_locks和innodb_lock_waits表来分析和解决锁等待问题。此外,优化系统代码以避免长时间未提交的事务也是预防此类问题的重要措施。
摘要由CSDN通过智能技术生成

问题出现的原因:假设有两个事务A和事务B,他们两个都存在update 同一条记录,A 先修改,但是没有提交事务,B也想修改但是一直等,直到等到了超过了innodb_lock_wait_timeout所设置的时间,就会爆出此异常

模仿异常的出现:

 创建一个表:

CREATE TABLE `emp` (
  `id` int(4) NOT NULL,
  `deptno` int(4) DEFAULT NULL,
  `col3` int(4) DEFAULT NULL,
  `col4` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

并在表中随便插入几条数据。

用navicate 连接上mysql服务,并设置客户端set autocommit=0  ,用mysql-client 也连接上服务并使用相应的数据库,并设置set autocommit=0 。

在第一个客户端执行

START TRANSACTION;
update emp SET deptno=2 WHERE id=2; 此时不要commit;

在第二个客户端执行对同一条记录的修改,如

START TRANSACTION;

update emp SET deptno=2 WHERE id=2;

此时执行结果如下图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值