MySQL長事務處理辦法

2021-10-23 08:22:46 字數 1134 閱讀 8348

長事務(long-lived transactions),顧名思義,就是執行時間較長的事務。在innodb中可以查詢到當前執行中的事務。

select * from information_schema.innodb_trx;
在訪問表時,innodb會自動給加上元資料鎖(meta data lock,mdl),mdl是表級鎖。如果是讀,就是共享鎖,寫就是排它鎖。當首席執行官事務時,後續的事務如果要獲取排它鎖就會被阻塞。可能引發系統崩潰嚴重事故。

解決辦法:

1.等系統不繁忙時操作

2.檢查表information_schema.innodb_trx是否有長事務,考慮先暫停ddl,或者kill掉這個長事務。

3.將長事務分解成小批量事務。

4.設定等待獲取鎖時間,超時時放棄更新。

alter table tbl_name wait n add column ...
拓展:

全域性鎖

全域性鎖就對整個資料庫例項加鎖,加鎖後整個例項就處於唯讀狀態,後續的mdl的寫語句,ddl語句,已經更新操作的事務提交語句都將被阻塞。其典型的使用場景是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性檢視,保證資料的完整性。加全域性鎖的兩種方法:

一.flush tables write read lock(ftwrl,推薦使用)

二.set global readonly=true

當你需要讓整個庫處於唯讀狀態的時候,可以使用ftwrl這種方式。之後其他執行緒的以下語句會被阻塞:資料更新語句(資料的增刪改)、資料定義語句(包括建表、修改表結構等)和更新類事務的提交語句。

全域性鎖的典型使用場景是,做全庫邏輯備份。也就是把整庫每個表都select出來存成文字。

注意,在備份過程中整個庫完全處於唯讀狀態。

在innodb引擎中可以使用官方自帶的邏輯備份工具是mysqldump。當mysqldump使用引數–single-transaction的時候,導資料之前就會啟動乙個事務,來確保拿到一致性檢視。而由於mvcc的支援,這個過程中資料是可以正常更新的。

MySQL事務處理

start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...

mysql事務處理

mysql的事務處理主要有兩種方法 1.用begin,rollback,commit來實現 begin開始乙個事務 rollback事務回滾 commit 事務確認 2.直接用set來改變mysql的自動提交模式 mysql預設是自動提交的,也就是你提交乙個query,就直接執行!可以通過 set ...

mysql事務處理

事務都應該具備acid特徵。所謂acid是atomic 原子性 consistent 一致性 isolated 隔離性 durable 持續性 四個詞的首字母所寫,下面以 銀行轉帳 為例來分別說明一下它們的含義 1 原子性 組成事務處理的語句形成了乙個邏輯單元,不能只執行其中的一部分。換句話說,事務...