MySQL事务RUNNING状态引发的Transactiontimedout:deadline问

页面导航:首页 > 数据库 > Mysql > MySQL事务RUNNING状态引发的Transactiontimedout:deadline问

MySQL事务RUNNING状态引发的Transactiontimedout:deadline问

来源: 作者: 时间:2016-01-22 08:34 【

提供mysql数据库教程,命令,安装等技术文摘

前言:
朋友说简单的查询导致Transaction timed out: deadline问题,怀疑是数据库表锁了,

1,应用故障描述Deadline问题:
--- The error occurred in META-INF/ibatis/ITEM_sqlmap.xml.
2,检查Innodb存储引擎状态以及表锁状态

SHOW ENINGE INNODB STATUS;没有死锁信息以及其它异常信息;去查询系统表INNODB_LOCKS、INNODB_LOCK_WAITS表都为NULL,只有INNODB_TRX表有记录,并且处于长时间RUNNING状态,判断是因为事务没有提交或者回滚的缘故。
mysql> SELECT * FROM `INNODB_TRX`;
3,问题重现,查看事务表记录
mysql> SELECT * FROM `INNODB_TRX`;
4,去Slow log和binlog里面分析

去slow log里面看942663线程ID的slow记录,没有找到, 去看binlog里面942663线程ID的DML记录,有如下2条记录:
#141125 17:41:10 server id 230 end_log_pos 118147 CRC32 0x6f2402a1 Query thread_id=942663 exec_time=0 error_code=0


5,期间遇到的额外问题
Cause: java.sql.SQLException: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
6,总结
这个问题看似解决了,但是可能还有更多的细节没有梳理,为什么事务开启后没有ROLLBACK或者COMMIT,后续执行SELECT就会报错呢?自己想来是DML形成排它锁X,而查询是有共享锁S,X和S是互斥的(关于Innodb锁请参考:http://blog.itpub.net/26230597/viewspace-1315111/),所以就出问题了,至于层的底层分析,有待以后继续深究,如果有遇到此类问题的朋友,欢迎share下你的处理思路以及分析过程,谢谢。

Tags:

文章评论


<