一、樂觀鎖(optimistic lock)
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫操作。
【note】:
比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。
二、悲觀鎖(pessimistic lock)
每次獲取資料的時候,都會擔心資料被修改,所以每次獲取資料的時候都會進行加鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。
【note】:
比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。
三、共享鎖(share lock)
共享鎖也叫s鎖,是一種讀鎖,當乙個事物獲得了一條資料的共享鎖,其它事務也能獲得該共享鎖,但不能獲得排他鎖,表明其它事務可讀。在執行語句後面加上lock in share mode就代表對某些資源加上共享鎖了。
共享鎖(s):select * from table_name where … lock in share mode。
【note】:
共享鎖保證大家可以一起讀,但只能乙個人寫。
四、排他鎖(exclusive lock)
排他鎖也叫x鎖,是一種寫鎖,當乙個事務對臨界區加上排他鎖,其它事務就不能獲得該臨界區的任何鎖(共享鎖,排他鎖)。
排他鎖(x):select * from table_name where … for update。
【note】:
排他鎖保證只能乙個人去處理資料,其他人不能讀也不能寫。
建立行鎖條件:
1、表中建立索引, select 。。。 where 字段(必須是索引) 不然行鎖就無效。
2、必須要有事務,這樣才是 行鎖(排他鎖)
3、在select 語句後面 加 上 for
update;
例子: 測試是否 加了鎖,先執行 1 後執行 2
查詢1start
transaction
; #加事務
select userid,password,age from accountsdb.accounts_info where accounts =
'hello2'
forupdate
; #加鎖
select sleep(5
); # 睡眠
commit
; #提交
查詢2 :
start
transaction
;select userid,password,age from accountsdb.accounts_info where accounts =
'hello2'
forupdate
;commit
;
五、行鎖
行鎖,由字面意思理解,就是給某一行加上鎖,也就是一條記錄加上鎖。
六、表鎖
表鎖,和行鎖相對應,給這個表加上鎖。
意向鎖innodb所用的表級鎖,其設計目的主要是為了在乙個事務中揭示下一步將要被請求的鎖的型別。
innodb中的兩個表鎖:
意向共享鎖(is):
表示事務準備給資料行加入共享鎖,也就是說乙個資料行加共享鎖前必須先取得該錶的is鎖
意向排他鎖(ix):
類似上面,表示事務準備給資料行加入排他鎖,說明事務在乙個資料行加排他鎖前必須先取得該錶的ix鎖。
意向鎖是innodb自動加的,不需要使用者干預。
MySQL的各種鎖
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖 因為不擔心資料被修改 但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫...
MySQL的各種鎖
文章目錄 一 樂觀鎖 optimistic lock 二 悲觀鎖 pessimistic lock 三 共享鎖 share lock 四 排他鎖 exclusive lock 五 行鎖 六 表鎖 七 資料庫隔離級別的實現 1 read uncommitted 讀未提交的資料 2 read commi...
MySQL 各種鎖的概念
樂觀鎖大多是基於資料版本記錄機制實現,一般是給資料庫表增加乙個 version 字段。讀取資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。比如下單操作...