根據INNODB TRX表解決死鎖問題

2021-10-24 18:00:56 字數 2049 閱讀 2319

檢視死鎖程序:show processlist;

檢視死鎖日誌:show engine innodb status \g;

information.innodb_trx表字段解釋

trx_id:唯一事務id號,唯讀事務和非鎖事務是不會建立id的。

trx_weight:事務的高度,代表修改的行數(不一定準確)和被事務鎖住的行數。為了解決死鎖,innodb會選擇乙個高度最小的事務來當做犧牲品進行回滾。已經被更改的非交易型表的事務權重比其他事務高,即使改變的行和鎖住的行比其他事務低。

trx_state:事務的執行狀態,值一般分為:running, lock wait, rolling back, and committing.

trx_started:事務的開始時間

trx_requested_lock_id:如果trx_state是lockwait,顯示事務當前等待鎖的id,不是則為空。想要獲取鎖的資訊,根據該lock_id,以innodb_locks表中lock_id列匹配條件進行查詢,獲取相關資訊。

trx_wait_started:如果trx_state是lockwait,該值代表事務開始等待鎖的時間;否則為空。

trx_mysql_thread_id:mysql執行緒id。想要獲取該執行緒的資訊,根據該thread_id,以information_schema.processlist表的id列為匹配條件進行查詢。

trx_query:事務正在執行的sql語句。

trx_operation_state:事務當前的操作狀態,沒有則為空。

trx_tables_in_use:事務在處理當前sql語句使用innodb引擎表的數量。

trx_tables_locked:當前sql語句有行鎖的innodb表的數量。(因為只是行鎖,不是表鎖,表仍然可以被多個事務讀和寫)

trx_lock_structs:事務保留鎖的數量。

trx_lock_memory_bytes:在記憶體中事務索結構占得空間大小。

trx_rows_locked:事務行鎖最準確的數量。這個值可能包括對於事務在物理上存在,實際不可見的刪除標記的行。

trx_rows_modified:事務修改和插入的行數

trx_concurrency_tickets:該值代表當前事務在被清掉之前可以多少工作,由 innodb_concurrency_tickets系統變數值指定。

trx_isolation_level:事務隔離等級。

trx_unique_checks:當前事務唯一性檢查啟用還是禁用。當批量資料匯入時,這個引數是關閉的。

trx_foreign_key_checks:當前事務的外來鍵堅持是啟用還是禁用。當批量資料匯入時,這個引數是關閉的。

trx_last_foreign_key_error:最新乙個外來鍵錯誤資訊,沒有則為空。

trx_adaptive_hash_latched:自適應雜湊索引是否被當前事務阻塞。當自適應雜湊索引查詢系統分割槽,乙個單獨的事務不會阻塞全部的自適應hash索引。自適應hash索引分割槽通過 innodb_adaptive_hash_index_parts引數控制,預設值為8。

trx_adaptive_hash_timeout:是否為了自適應hash索引立即放棄查詢鎖,或者通過呼叫mysql函式保留它。當沒有自適應hash索引衝突,該值為0並且語句保持鎖直到結束。在衝突過程中,該值被計數為0,每句查詢完之後立即釋放門閂。當自適應hash索引查詢系統被分割槽(由 innodb_adaptive_hash_index_parts引數控制),值保持為0。

trx_is_read_only:值為1表示事務是read only。

trx_autocommit_non_locking:值為1表示事務是乙個select語句,該語句沒有使用for update或者shared mode鎖,並且執行開啟了autocommit,因此事務只包含乙個語句。當trx_autocommit_non_locking和trx_is_read_only同時為1,innodb通過降低事務開銷和改變表資料庫來優化事務。

用途:

1、該錶用於當系統負載較高時,診斷效能問題。

2、檢視當前使用鎖的事物,可以kill trx_id進行釋放鎖

oracle解決死鎖

第一步 檢視是否有死鎖存在,查出有資料則代表有死鎖 select p.spid,c.object name,b.session id,b.oracle username,b.os user name from v process p,v session a,v locked object b,all...

Windows Oracle解決死鎖

背景 執行某個查詢功能,無返回無報錯,再次請求時出現死鎖異常。導致後台和其他相關的後台服務無法對該錶進行任何操作。1 查詢導致死鎖的session和object name 被鎖死的表 select l.session id,o.owner,o.object name from v locked ob...

解決死鎖問題

之前的例子 只是測試 只是為了說明原理,例子本身很簡單,所以有一些考慮不周的地方。比如當獲取到鎖之後在業務操作執行過程中發生了環境問題導致斷開了和redis的連線,那就無法在finally塊中釋放鎖,導致其他等待獲取鎖的執行緒無限等待下去,也就是發生了死鎖現象。解決方式 可以在redis中給鎖設定乙...