MySQL的GET_LOCK函式

發表於2019-05-11

加鎖:"SELECT GET_LOCK('{$key}', {$timeout}) AS get_lock";解鎖:"SELECT RELEASE_LOCK('{$key}') AS release_lock";

  • GET_LOCK(str,timeout)

設法使用字串str 給定的名字得到一個鎖, 超時為timeout 秒。若成功得到鎖,則返回 1,若操作超時則返回0 (例如,由於另一個客戶端已提前封鎖了這個名字 ),若發生錯誤則返回NULL (諸如缺乏記憶或執行緒mysqladmin kill 被斷開 )。假如你有一個用GET_LOCK()得到的鎖,當你執行RELEASE_LOCK()或你的連線斷開(正常或非正常)時,這個鎖就會解除。

這個函式可用於執行應用程式鎖或模擬記錄鎖定。名稱被鎖定在伺服器範圍內。假如一個名字已經被一個客戶端封鎖,GET_LOCK() 會封鎖來自另一個客戶端申請封鎖同一個名字的任何請求。這使對一個封鎖名達成協議的客戶端使用這個名字合作執行建議鎖。然而要知道它也允許不在一組合作客戶端中的一個客戶端封鎖名字,不論是服役的還是非故意的,這樣阻止任何合作中的客戶端封鎖這個名字。一個減少這種情況發生的辦法就是使用資料庫特定的或應用程式特定的封鎖名。例如, 使用db_name.str或 app_name.str 形式的封鎖名。

mysql> SELECT GET_LOCK('lock1',10);

        -> 1

mysql> SELECT IS_FREE_LOCK('lock2');

        -> 1

mysql> SELECT GET_LOCK('lock2',10);

        -> 1

mysql> SELECT RELEASE_LOCK('lock2');

        -> 1

mysql> SELECT RELEASE_LOCK('lock1');

        -> NULL

注意,第二個 RELEASE_LOCK()呼叫返回 NULL ,原因是鎖'lock1' 杯第二個GET_LOCK()呼叫解開。

評論(1)

相關文章