mysql XA 空事物鎖

2021-09-23 18:15:08 字數 1319 閱讀 5206

今天開發過來和我說有乙個舊賬號總是登入不上,一直卡在登入介面不跳轉,後台程式那邊排查之後,反應說資料庫有鎖。

查詢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

xid [

join

|resume]

xaend

xid [

suspend

[for

migrate]]

xaprepare

xidxa

commit

xid [

onephase]

xarollback

xidxa

recover

[convert

xid]

rm(資源管理器):

提供對事務資源的訪問。資料庫伺服器是一種資源管理器。必須可以提交或回滾rm管理的事務。

tm(事物管理器):

協調作為全域性事務一部分的事務。它與處理每個事務的rm進行通訊。全域性事務中的各個事務是全域性事務的 「 分支 」。全域性事務及其分支由後面描述的命名方案標識。

執行外部xa事物分兩個階段進行提交:

在第一階段,所有分支都準備好了。也就是說,tm告訴他們準備提交。rm會記錄事物操作。表明他們是否能夠這樣做,並用於第二階段。

在第二階段,tm告訴rm是否提交或回滾。如果所有分支在準備好時表示他們能夠提交,則告知所有分支都要提交。如果任何分支在準備時指示它將無法提交,則告知所有分支都回滾。

在某種情況下,全域性事務可能使用單階段提交(1pc),通常指單個事物的提交,使rm和tm同時準備和提交。

事物屬性,以及鎖

事物定義 訪問並可能更新資料庫的執行單元,有4個屬性,語句多事begin transaction end transaction 1,事物的屬性 1.1 原子性 事物的所有操作要麼全部執行,要麼全部不執行,這個主要是通過日誌來實現,日誌中會記錄我們修改的事物識別符號,修改的資料項識別符號以及資料項的...

Mysql 鎖和事物

1.共享鎖 讀鎖 讀鎖允許多個連線可以同一時刻併發的讀取同一資源,互不干擾 2.排他鎖 寫鎖 寫鎖會阻塞其他的寫鎖或讀鎖,保證同一時刻只有乙個連線可以寫入資料,同時防止其他使用者對這個資料的讀寫 3.鎖策略 保證了執行緒安全的同時獲取最大的效能之間的平衡策略,因為鎖的開銷是較為昂貴的 a.表鎖 my...

mysql事物中行鎖與表鎖

事物與鎖 什麼叫不支援事物 首先要了解資料庫裡的事務是什麼意思。事務在計算機資料庫裡 在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在關聯式資料庫中,乙個事務可以是一條sql語句,一組sql語句或整個程式。簡單的講 舉例來說 a 匯100塊錢給 b,a 減少100 ...