mysql中的get_lock鎖機制解析
GET_LOCK(key,timeout) 需要兩個連接會話
RELEASE_LOCK(key) 鎖是否釋放,釋放了返回1
IS_FREE_LOCK(key) 返回當前連接ID,表示名稱為'xxxx'的鎖正在被使用。
key 鎖的名字,timeout加鎖等待時間,時間內未加鎖成功則事件回滾。get_lock 加鎖成功返回1,
這個鎖是應用程序級別的,在不同的mysql會話之間使用,是名字鎖,不是鎖具體某個表名或字段,具體是鎖什么完全交給應用程序。它是一種獨占鎖,意味着哪個會話持有這個鎖,其他會話嘗試拿這個鎖的時候都會失敗。
session A select get_lock('test',1);
session B select get_lock('test',5);
可以指定表也可以不指定
直到關閉連接會話結束,鎖才會釋放,但不像redis那樣加了鎖只要不主動釋放就一直有。
但是當會話1 get_lock 后,未釋放。會話2 不get_lock 同一個key,或者就不get_lock,依然可以對數據進行任何操作,所以加鎖只是說人為的主觀的想要讓某些操作同時只有一個連接能進行操作,別的連接不調用get_lock加同一個鎖,那它不會受到任何影響,想干什么干什么。
session1
session2
get_lock:但是當會話1 get_lock 后,未釋放。會話2 不get_lock 同一個key,或者就不get_lock,依然可以對數據進行任何操作,所以加鎖只是說人為的主觀的想要讓某些操作同時只有一個連接能進行操作,別的連接不調用get_lock加同一個鎖,那它不會受到任何影響,想干什么干什么。
session1
session2
優缺點分析 (1)這種方式對於更新所有列比較有效,但是得把查詢的語句也放在鎖內執行; (2)這種方式當客戶端無故斷線了會自動釋放鎖,比較好,不像redis鎖那樣,如果加完鎖斷了,那么鎖一直在; (3)這種方式是針對鎖內的所有操作加鎖,並不針對特定表或特定行,所以使用了同一個Key的鎖但不同的操作都會共用一把鎖,會導致效率低下; (4)如果查詢語句放在鎖之前,則數據可能是舊的,更新之后會把查詢之后更新之前別的客戶端更新的數據覆蓋掉;