Mysql中GET_LOCK的用法

基本用法
SELECT GET_LOCK(key, timeout) FROM DUAL;
SELECT RELEASE_LOCK(key) FROM DUAL;
含義解釋

其中GET_LOCK()和RELEASE_LOCK()分別是兩個函數,并且有參數和返回值,這里的DUAL是偽表,在Oracle中很常見,就是一個不存在的表,用來臨時記錄值的。

  • GET_LOCK有兩個參數,一個是key,就是根據這個參數進行加鎖的,另一個是等待時間(s),即獲取鎖失敗后等待多久回滾事務。

    這里假設連接A先GET_LOCK("lock_test", 10),因為lock_test這個字段在之前沒有加鎖所以不需要等待,直接返回1,加鎖成功。
    然后連接B再GET_LOCK("lock_test", 10),等待10s,若這期間沒有釋放這個字段的鎖,則10s過后返回0,連接B加鎖失敗。
    這里的問題就是這個加鎖方式很危險,一旦加鎖之后忘記釋放,就會一直鎖住這個字段,除非連接斷開。尤其是第二個參數,千萬不要理解成超時時間,并不是設置一個字段的鎖,然后超過這個時間就自動釋放了,這個是等待時間,即第二次對同一個字段加鎖,等待多久然后返回。

  • 這個RELEASE_LOCK就沒什么好說的了,記得加鎖之后釋放就可以了,成功釋放回返回1。

實際應用

需要注意的是這個鎖是基于單個數據庫的,如果在分布式環境下,有多臺物理主機多個數據庫,這個鎖的方式就失效了,這種情況需要借助Zookeeper來實現了。
在單數據庫的環境下,如果想防止多個線程操作同一個表(多個線程可能分布在不同的機器上),可以使用這種方式,取表名為key,操作前進行加鎖,操作結束之后進行釋放,這樣在多個線程的時候,即保證了單個表的串行操作,又保證了多個不同表的并行操作。
實際上這個鎖的應用場景還是很多的,但由于方法過于危險,應盡量謹慎使用。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容