一.概述 在資料庫中,數據是屬於共用資源,為了保證併發訪問的一致性,有效性,產生了鎖。接下來重點討論mysql鎖機制的特點,常見的鎖問題,以及解決mysql鎖問題的一些方法或建議。 相比其他資料庫,mysql 鎖機制比較簡單,顯著的特點是 不同的存儲引擎支持不同的鎖機制。在innodb中支持行鎖和表 ...
一.概述
在資料庫中,數據是屬於共用資源,為了保證併發訪問的一致性,有效性,產生了鎖。接下來重點討論mysql鎖機制的特點,常見的鎖問題,以及解決mysql鎖問題的一些方法或建議。 相比其他資料庫,mysql 鎖機制比較簡單,顯著的特點是 不同的存儲引擎支持不同的鎖機制。在innodb中支持行鎖和表鎖,預設行鎖。
mysql 的三種鎖歸納如下:
表級鎖:開銷小,加鎖快,不會出現死鎖,鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖,鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間,會出現死鎖,併發度一般。
在不同sql語句執行,會採用不同的鎖,由mysql 內部自動加鎖,解鎖,以及對應的鎖類型。重點介紹mysql表鎖和innodb行鎖。由於MyisAm將被innodb取代了,後面重點講innodb。
1. 事務介紹
innodb的二個特點是一是支持事務,二是採用行級鎖,但事務的引入也帶來了一些新問題,先介紹一下背景知識。
1.1 事務及其屬性ACID
事務是同一組sql語句組成的邏輯處理單元,具有原子性,一致性,隔離性,持久性。
1.2 併發事務處理帶來的問題
更新丟失,臟讀,不可重覆讀,幻讀。
1.3 事務隔離級別
由於併發事務處理帶來的問題,那麼解決方法就是對應不同的事務隔離級別。 資料庫實現事務隔離的方式,基本上分為以下兩種:
(1)一種是在讀取數據前,對其加鎖,阻止其他事務對數據進行修改。
(2)另一種是不用加任何鎖,通過快照 Snapshot 形式的 “數據版本併發控制” (MultiVersion Concurrency Control)簡稱MVCC。
資料庫的事務隔離級別越嚴格,併發副作用越小,付出的代價也就越大,因為實質上就是使事務在一定程度上"串列化"進行,這與"併發"是矛盾的。
下麵是四種隔離級別:
2. 隔離級別查看
-- 查看事務隔離級別,預設是REPEATABLE-READ,在sql server里預設是Read Committed SELECT @@tx_isolation
關於事務,事務併發問題,事務隔離級別,它們的原理這裡有詳細介紹“sql server 鎖與事務撥雲見日”。(未完)