XA事务回滚处理Lock wait timeout exceeded

目录

自测过程中,修改指定的一条数据报错

该条数据被锁定的可能原因

1、其他sql也在修改该条数据

2、未提交的事务里对该条数据进行了修改

解决:回滚XA事务

XA事务

概述

分布式事务实现

出现锁超时的根本原因


自测过程中,修改指定的一条数据报错

SQL: update XXX set status_id = ?, about_id = ? where id in ( 109 );

报错详情

### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may involve com.XXXMapper.updateXXX()
### The error occurred while setting parameters
### SQL: update XXX set status_id = ?, about_id = ? where id in ( ? )
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

该条数据被锁定的可能原因

1、其他sql也在修改该条数据

查看正在运行的sql:select * from information_schema.processlist where info is not null;


可见没有对该条数据修改的操作

2、未提交的事务里对该条数据进行了修改

查看事务:SELECT * FROM information_schema.INNODB_TRX;

可以将未提交的事务kill掉:SELECT concat('kill ', trx_mysql_thread_id, ";") t_sql FROM information_schema.INNODB_TRX;

但是可见,未提交的事务为XA事务,trx_mysql_thread_id=0 的事务全部为XA事务。

解决:回滚XA事务

查询XA事务信息:xa recover;

 回滚XA事务

 XA事务回滚命令的格式如下(使用的字段如上事务信息组装执行即可)

# 回滚XA事务格式
xa rollback 'left(data,gtrid_length)', 'substr(data,gtrid_length+1,bqual_length)', formatID;

# 本例处理
xa rollback '10.220.17.74.tm163972871540800001', '10.220.17.74.tm3', 1096044365;

 回滚后发现更新正常了,问题解决

XA事务

XA(eXtended Architecture)是指由 X/Open 组织提出的分布式交易处理的规范。XA 是一个分布式事务协议,由 Tuxedo 提出,所以分布式事务也称为XA 事务。

概述

XA 协议主要定义了事务管理器TM和资源管理器RM之间的接口

事务管理器TM(Transaction Manager,协调者):协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信,负责各个本地资源的提交和回滚。

资源管理器RM(Resource Manager,参与者):提供访问事务资源的方法,通常一个数据库就是一个资源管理器,如Oracle、DB2、MySQL,这些商业数据库都实现了XA 接口

分布式事务实现

XA 事务是基于两阶段提交(Two-phaseCommit,2PC)协议实现的,可以保证数据的强一致性。

阶段一为准备阶段prepare,即所有的参与者准备执行事务并锁住需要的资源。当参与者Ready时,向TM 汇报自己已经准备好。

阶段二为提交阶段commit。当TM 确认所有参与者都Ready 后,向所有参与者发送COMMIT 命令。

出现锁超时的根本原因

如果执行分布式事务的mysql crash了,MySQL按照如下逻辑进行恢复:

a. 如果这个xa事务commit了,那么什么也不用做。

b. 如果这个xa事务还没有prepare,那么直接回滚它。

c. 如果这个xa事务prepare了,还没commit,那么把它恢复到prepare的状态,由用户去决定commit 或 rollback。

当mysql crash后重新启动之后,执行“XA RECOVER;”查看当前处于 prepare 状态的XA事务,然后 commit 或 rollback 它们。

总结,所以是在事务 prepare后commit前,发生mysql crash了,该情况是要由用户决定该 commit 还是 rollback,所以此时是prepare状态,而准备状态是所有的参与者准备执行事务并锁住需要的资源,资源已经被锁住了,所以再去请求时,发生了锁超时。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lock wait timeout exceeded是指在MySQL数据库中,一个事务等待另一个事务释放的时间超过了设定的等待时间。当一个事务等待其他事务释放的时候,如果等待时间超过了设定的等待时间,就会发生Lock wait timeout exceeded错误。 这个错误通常出现在并发性高的系统中,当多个事务同时竞争相同的资源时会发生。当一个事务需要修改某个资源(例如一行记录)时,它会获取一个写来保护这个资源,其他事务需要读取或修改这个资源时,必须等待该写被释放。如果等待时间过长,就会触发Lock wait timeout exceeded错误。 解决这个错误的方法包括: 1. 调整等待时间:可以通过修改MySQL的配置文件来增加等待时间,以便给事务更多的时间来等待的释放。 2. 优化查询语句:通过优化查询语句,减少对相同资源的竞争,可以减少等待时间。 3. 降低并发度:通过减少并发操作的数量,可以减少对相同资源的竞争,从而减少等待时间。 4. 使用合适的索引:使用合适的索引可以提高查询性能,减少对相同资源的竞争,从而减少等待时间。 5. 分布式事务处理:将大事务拆分为多个小事务,分布在不同的节点上进行处理,可以减少对相同资源的竞争,从而减少等待时间。 总之,Lock wait timeout exceeded错误是由于一个事务等待另一个事务释放的时间超过了设定的等待时间而引发的。通过调整等待时间、优化查询语句、降低并发度、使用合适的索引和分布式事务处理等方法,可以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值