標籤:事務 瑣 acid mvcc
一、mysql的並發控制
當有多個查詢需要同時修改同一個資料,就會產生並發控制的問題。mysql可以在兩個層面進行並發控制:伺服器層和儲存引擎層。
mysql通過加鎖實現並發控制:
⑴鎖有兩類:
讀鎖:共用鎖定,即一個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同一個資源,而不互相干擾。
寫鎖:獨佔鎖定,即一個寫鎖會阻塞其它讀寫鎖,在給定時間內,只有一個使用者能執行寫入。
⑵鎖粒度:
表級鎖:鎖定整張表
行級鎖:並發程度更高,但維護較麻煩,會增加系統開銷,易產生死結。行級鎖只能在儲存引擎層級實現,MyISAM儲存引擎不支援行級鎖
⑶鎖分類:
隱式鎖:由儲存引擎自動完成
顯式鎖:使用者可手動施加鎖(表級鎖)
⑷手動加解鎖:伺服器層級
LOCK TABLES tb_name {READ|WRITE},...;
UNLOCK TABLES;
FLUSH TABLES WITH READ LOCK; #全域施加讀鎖
InnoDB儲存引擎也支援另外一種顯式鎖(只鎖定挑選出的行):
SELECT ... LOCK IN SHARE MODE;
SELECT ... FOR UPDATE;
二、事務
事務(Transaction)是訪問並可能更新資料庫中各種資料項目的一個程式執行單元(unit);
設想一個情境,A要向B轉賬500元,要經過兩個步驟:A從自己的賬戶中減去500元;向B的賬戶增加500元。顯而易見,只完成第一步或者只完成第二步都不合理,這兩個步驟必須放入一個事務中,當作一個不可分割的工作單位,要麼都執行,要麼都不執行。
⑴事務是恢複和並發控制的基本單位,要符合事務的概念,必須通過ACID測試:
原子性(atomicity):一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency):事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation):一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的資料對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的
⑵事務的隔離等級:
READ-UNCOMMITTED(讀未提交):事務中的修改,即使沒有提交,對其它事務也是可見的。事務可以讀取未提交的資料,這也稱為“髒讀”;最低的隔離等級
READ-COMMTTED(讀提交):一個事務開始時,只能“看見”已提交的事務所做的修改,因此,再次執行同樣的查詢,可能得到不一樣的結果,稱為“不可重複讀取”。
REPEATABLE-READ(可重讀):保證了在同一個事務中多次讀取同樣記錄的結果是一致的,可能引起“幻讀”;mysql預設隔離等級
SERIALIZABILE(可序列化):加鎖讀,即事務請求不到鎖就無法讀,必須等到其它事務釋放鎖(提交或復原)後才行。
⑶查看mysql的隔離等級:SELECT @@global.tx_isolation;
⑷事務的啟動、提交和加滾:
啟動:START TRANSACTION;
提交:COMMIT;
復原:ROLLBACK;
儲存點:SAVEPOINT identifier;
復原至某個儲存點:ROLLBACK [WORK] TO [SAVEPOINT] identifier;
刪除某儲存點:RELEASE SAVEPOINT identifier;
⑸MySQL的自動認可功能:SELECT @@GLOBAL.autocommit;
預設是啟用的,修改autocommit僅對支援事務的儲存引擎產生影響;
自動認可能保證資料及時寫入磁碟,但會造成頻繁I/O,降低系統效能。
⑹MVCC: 多版本並發控制;通過儲存資料在某個時間點的快照實現。無論事務執行多長時間,其看到的資料都是一致的。根據事務開始的時間不同,每個事務對同一張表、同一時刻看到的資料可能是不一樣的。MVCC僅在第二、第三隔離等級下有效;
⑺交易記錄:將隨機I/O轉換為順序I/O,以提升事務操作效率;交易記錄也稱為Write-Ahead Logging。
資料從記憶體->交易記錄->資料檔案
為減輕磁碟壓力,宜將交易記錄和資料檔案放於不同的磁碟上,交易記錄不宜太大;
⑻InnoDB支援事務,而MyISAM不支援
MySQL學習筆記之四:並發控制和事務機制