今天开发过来和我说有一个旧账号总是登录不上,一直卡在登录界面不跳转,后台程序那边排查之后,反应说数据库有锁。
查找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事物分两个阶段进行提交:
-
在第一阶段,所有分支都准备好了。也就是说,TM告诉他们准备提交。RM会记录事物操作。表明他们是否能够这样做,并用于第二阶段。
-
在第二阶段,TM告诉RM是否提交或回滚。如果所有分支在准备好时表示他们能够提交,则告知所有分支都要提交。如果任何分支在准备时指示它将无法提交,则告知所有分支都回滚。
在某种情况下,全局事务可能使用单阶段提交(1PC),通常指单个事物的提交,使RM和TM同时准备和提交。