程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL事務RUNNING狀態引發的Transactiontimedout:deadline問題

MySQL事務RUNNING狀態引發的Transactiontimedout:deadline問題

編輯:MySQL綜合教程

MySQL事務RUNNING狀態引發的Transactiontimedout:deadline問題



前言:
朋友說簡單的查詢導致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下你的處理思路以及分析過程,謝謝。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved