快照讀:
簡單的select操作,沒有lock in share mode或for update,快照讀不會加任何的鎖,而且由於mysql的一致性非鎖定讀的機制存在,任何快照讀也不會被阻塞。但是如果事務的隔離級別是serializable的話,那麼快照讀也會被加上共享的next-key鎖,本文不對serializable隔離級別做敘述。
當前讀:
官方文件的術語叫locking read,也就是insert,update,delete,select..in share mode和select..for update,當前讀會在所有掃瞄到的索引記錄上加鎖,不管它後面的where條件到底有沒有命中對應的行記錄。當前讀可能會引起死鎖。
意向鎖:
innodb的意向鎖主要使用者多粒度的鎖並存的情況。比如事務a要在乙個表上加s鎖,如果表中的一行已被事務b加了x鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖標誌的開銷將很大,系統的效能將會受到影響。為了解決這個問題,可以在表級上引入新的鎖型別來表示其所屬行的加鎖情況,這就引出了「意向鎖」的概念。舉個例子,如果表中記錄1億,事務a把其中有幾條記錄上了行鎖了,這時事務b需要給這個表加表級鎖,如果沒有意向鎖的話,那就要去表中查詢這一億條記錄是否上鎖了。如果存在意向鎖,那麼假如事務a在更新一條記錄之前,先加意向鎖,再加x鎖,事務b先檢查該錶上是否存在意向鎖,存在的意向鎖是否與自己準備加的鎖衝突,如果有衝突,則等待直到事務a釋放,而無須逐條記錄去檢測。事務b更新表時,其實無須知道到底哪一行被鎖了,它只要知道反正有一行被鎖了就行了。
說白了意向鎖的主要作用是處理行鎖和表鎖之間的矛盾,能夠顯示「某個事務正在某一行上持有了鎖,或者準備去持有鎖」
不可重複讀:
指的是在同乙個事務中,連續幾次快照讀,讀取的記錄應該是一樣的
不可重複讀的演示較為簡單,本文不做討論。
幻讀:指的是在乙個事務a中執行了乙個當前讀操作,而另外乙個事務b在事務a的影響區間內insert了一條記錄,這時事務a再執行乙個當前讀操作時,出現了幻行。這和不可重複讀的主要區別就在與事務a中乙個是快照讀,乙個當前讀;並且事務b中乙個是任何的dml操作,乙個只是insert。比如在a中select * from test where id<10 lock in share mode結果集為(1,2,3),這時在b中對test表插入了一條記錄4,這時在a中重新查詢結果集就是(1,2,3,4),和事務a在第一次查詢出來的結果集不一致,這裡的4就是幻行。
演示條件:由於可重讀的隔離級別下,預設採用next-key locks,就是record lock和gap lock的結合,即除了鎖住記錄本身,還要再鎖住索引之間的間隙,所以這個gap lock機制預設開啟,並不會產生幻行,那麼我們要演示幻行的話,要麼將隔離級別改為read-commited,要麼在repeatable-read模式下禁用掉gap lock,這裡我們採用的是第二種方式。
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...
mysql鎖機制 php Mysql鎖機制
表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...
mysql鎖機制總結 mysql鎖機制總結
1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...