mysql XA 空事物锁

开发反馈旧账号登录卡在界面,后台排查发现数据库有锁。查找相关表无法分析事务,怀疑是XA事务未提交,介绍了查看XA事务状态和释放锁的方法。还阐述了MySQL的XA事务,包括内部XA和外部XA,以及外部XA事务的执行阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天开发过来和我说有一个旧账号总是登录不上,一直卡在登录界面不跳转,后台程序那边排查之后,反应说数据库有锁。

查找information_schema库下的INNODB_LOCK_WAITS和INNODB_TRX表,查找到当时正在锁定的事物:

SELECT * FROM information_schema,INNODB_TRX

发现这些事物的trx_mysql_thread_id都为0,而且trx_state列的状态都为Running状态,trx_query的语句为NULL,无法通过相关的表分析出事物。

然后怀疑是因为XA事物可能是未提交:

查看XA事物状态:

XA RECOVER;

释放锁:

XA ROLLBACK xid;

 

XA事物:

对于mysql的XA事物,有两种:

1. 内部XA。

当前只有innodb引擎支持XA事物,在开启二进制日志的情况下,MySQL同时维护了binlog日志与innodb的redo log

为了保证这两个日志的一致性,MySQL在内部使用了XA事物,成为内部XA

2. 外部XA

一般指分布式事物,MySQL充当RM,客户端充当TM,实现外部XA。

外部XA使用以下语句完成分布式事物:

XA {START|BEGIN} xid [JOIN|RESUME]

XA END xid [SUSPEND [FOR MIGRATE]]

XA PREPARE xid

XA COMMIT xid [ONE PHASE]

XA ROLLBACK xid

XA RECOVER [CONVERT XID]

 

RM(资源管理器):

提供对事务资源的访问。数据库服务器是一种资源管理器。必须可以提交或回滚RM管理的事务。

TM(事物管理器):

协调作为全局事务一部分的事务。它与处理每个事务的RM进行通信。全局事务中的各个事务是全局事务的 “ 分支 ”。全局事务及其分支由后面描述的命名方案标识。

 

执行外部XA事物分两个阶段进行提交:

  1. 在第一阶段,所有分支都准备好了。也就是说,TM告诉他们准备提交。RM会记录事物操作。表明他们是否能够这样做,并用于第二阶段。

  2. 在第二阶段,TM告诉RM是否提交或回滚。如果所有分支在准备好时表示他们能够提交,则告知所有分支都要提交。如果任何分支在准备时指示它将无法提交,则告知所有分支都回滚。

在某种情况下,全局事务可能使用单阶段提交(1PC),通常指单个事物的提交,使RM和TM同时准备和提交。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值