Mysql 事務與鎖機制

2022-08-27 20:15:07 字數 3097 閱讀 7872

一. 事務四要素

資料庫事務正確執行的四個基本要素包括原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability),簡稱acid。目前要實現acid主要有兩種方式:一種是write ahead logging,也就是日誌式的方式(現代資料庫均基於這種方式);另一種是shadow paging。

二. myisam表鎖定

所有使用者行為最後執行的基本單位是單條操作命令(select、insert、update、delete等),它們都是原子操作。按照事務術語,myisam表總能高效地工作在autocommit=1模式下,原子操作通常能提供可比較的完整性以及更好的效能。這意味著,你能確信在每個特性更新執行的同時,其他使用者不能干涉它,而且不會出現自動回滾(如果你不小心,對於事務性表,這種情況可能發生),mysql伺服器還能保證不存在髒讀。

一般而言,所有由事務解決的完整性問題均能用lock tables或原子更新解決,從而確保了伺服器不會自動中斷,後者是事務性資料庫系統的常見問題。myisam只支援表級鎖定,允許多重讀或一次寫。lock tables可以鎖定用於當前執行緒的表,如果表被其它執行緒鎖定,則造成堵塞,直到可以獲取所有鎖定為止。unlock tables可以釋放被當前執行緒保持的任何鎖定。當執行緒發布另乙個lock tables時,或當與伺服器的連線被關閉時,所有由當前執行緒鎖定的表被隱含地解鎖。如果您想要確保在同一業務流中的select和update之間沒有其它執行緒訪問修改資料,就必須使用lock tables。如果你獲得了對某一表的read local鎖定(與寫鎖定相對),該錶允許在表尾執行並行插入,當其他客戶端執行插入操作時,允許執行讀操作。新插入的記錄不會被有讀鎖定屬性的客戶端看到,直至解除了該鎖定為止。使用insert delayed,能夠將插入項置於本地佇列中,直至鎖定解除,不會讓客戶端等待插入完成。

三.innodb事務與鎖定

在 innodb 中,所有使用者行為都在事務內發生,事務是其執行的基本單位。如果自動提交模式被允許,即 autocommit = 1,每個sql語句都將以乙個單獨的事務來執行;如果自動提交模式被用 set autocommit = 0 關閉,那麼我們可以認為乙個使用者總是有乙個事務開啟著,乙個sql commit或rollback語句結束當前事務並且乙個新事務開始,兩個語句都釋放所有在當前事務中被設定的innodb鎖定。

innodb除了表級鎖定之外,還支援更細粒度的行級鎖定,且行鎖和表鎖多重粒度可共存。

四. 行鎖與表鎖優劣對比

行級鎖定的優點

行級鎖定的缺點

mysql表鎖定機制:當乙個鎖定被釋放時,鎖定可被寫鎖定佇列中的執行緒得到,然後是讀鎖定佇列中的執行緒。這意味著,如果你在乙個表上有許多更新,select語句將等待直到沒有更多的更新。表更新通常情況認為比表檢索更重要,因此給予它們更高的優先順序,但這應確保更新乙個表的活動不能「餓死」,即使該錶上有很繁重的select活動

對write,mysql使用的表鎖定方法原理如下:

對read,mysql使用的表鎖定方法原理如下:

在以下情況下,表鎖定優於行級鎖定

表鎖定的注意事項

五. 選擇myisam

一般而言,使用行級鎖定的儲存引擎,應看看應用程式做什麼並且混合使用什麼樣的select和update。例如,大多數web應用程式執行許多select,而很少進行delete,只對key的值進行更新,並且只插入少量行。在mysql中對於使用表級鎖定的儲存引擎,表鎖定時不會死鎖的,這通過總是在乙個查詢開始時立即請求所有必要的鎖定並且總是以同樣的順序鎖定表來管理。

可以通過檢查table_locks_waited和table_locks_immediate狀態變數來分析系統上的表鎖定爭奪:

mysql> show status like 'table%';

+-----------------------+---------+

| variable_name | value |

+-----------------------+---------+

| table_locks_immediate | 1151552 |

| table_locks_waited | 15324 |

+-----------------------+---------+

如果資料檔案不包含空塊(從表的中部刪除或更新的行可能導致空洞),insert語句不衝突,可以自由為myisam表混合並行的insert和select語句而不需要鎖定,你可以在其它客戶正讀取myisam表的時候插入行,記錄總是插入在資料檔案的尾部;如果不能同時插入,為了在乙個表中進行多次insert和select操作,可以在臨時表中插入行並且立即用臨時表中的記錄更新真正的表,這也適合做批量延遲插入:

mysql> lock tables real_table write, insert_table write; 

mysql> insert into real_table select * from insert_table;

mysql> truncate table insert_table;

mysql> unlock tables;

六. 選擇innodb

innodb使用行鎖定,可能存在死鎖。這是因為,在sql語句處理期間,innodb自動獲得行鎖定,而不是在事務啟動時獲得。對於innodb和bdb(berkeleydb)表,如果你用lock tables顯式鎖定表,mysql只使用表鎖定,建議不要使用lock tables,因為innodb使用自動行級鎖定而bdb使用頁級鎖定來保證事務隔離。

innodb支援外來鍵約束。

一般說來,以多讀為主也附帶少量寫首選myisam,否則選擇innodb或其他引擎會更佳。

七.悲觀鎖與樂觀鎖

悲觀鎖和樂觀鎖不是資料庫中的標準概念,而只是一種通俗說法。

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

MySQL事務與鎖機制

在事務的四個特點中,一致性是事務的根本追求,而在某些情況下會對事務的一致性造成破壞,如 事務的併發執行 事務故障或者系統故障 資料庫系統通過併發控制技術和日誌恢復技術來避免這種情況的發生 併發控制技術保證了事務的隔離性,使得資料庫的一致性狀態不會因為併發執行的操作而被破壞。日誌恢復技術保證了事務的原...

MySQL鎖與事務隔離機制

事務行鎖和隔離級別的案例分析 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除了傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供需要使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重...