前言: 朋友说简单的查询导致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测试数据mon.jdbc.exception.NestedSQLException: 6,总结 这个问题看似解决了,但是可能还有更多的细节没有梳理,为什么事务开启后没有ROLLBACK或者COMMIT,后续执行SELECT就会报错呢?自己想来是DML形成 排它锁X,而查询是有共享锁S,X和S是互斥的(关于Innodb锁请参考:http://blog.itpub.net/26230597/viewspace-1315111/),所以就出问题了,至于 源码 层的底层分析,有待以后继续深究,如果有遇到此类问题的朋友,欢迎share下你的处理思路以及分析过程,谢谢。
查看更多关于MySQL事务RUNNING状态引发的Transactiontimedout:deadline问的详细内容...