MYSQL中GET LOCK的使用

2021-10-04 03:34:46 字數 3112 閱讀 7510

get_lock(str,timeout)

在timeout 秒內嘗試獲取乙個名字為str的鎖, 若成功得到鎖返回 1,若操作超時還未得到則返回0 (例如,另乙個連線獲取到了這個鎖未釋放),若發生錯誤則返回null (諸如缺乏記憶體或執行緒mysqladmin kill 被斷開 )。

假如你使用get_lock()得到乙個鎖,當你執行release_lock()時,或你的連線斷開(正常或非正常)時,或者持有鎖的連線獲取了其他鎖時,這個鎖才會解除。

release_lock(str)

釋放鎖str;只有獲取到鎖str的連線才能解鎖成功。獲取了鎖之後,用完記得釋放,不然別的sql語句獲取這個鎖就會失敗,解鎖成功返回1,失敗返回0,該鎖不存在則返回null。

is_free_lock(str)

檢查鎖str是否可用,返回結果為0,說明指定名稱的鎖正在被使用。返回1則說明這個鎖尚未被使用。

is_used_lock(str) 檢查鎖str是否正在被使用,返回結果為持有鎖的連線的連線id,表示給定名稱的鎖正在被該連線使用,若鎖沒有被使用返回null。

同乙個連線中順序執行以下語句:

返回結果為1說明鎖lock1尚未被使用

返回結果為null說明鎖lock1尚未被使用

返回結果為1說明該鏈結獲取鎖lock1成功

返回結果為0說明鎖lock1正在被使用

返回11說明鎖正在被連線id為11的連線使用

返回1說明同乙個連線中鎖lock1不進行釋放但獲取鎖lock1依然會成功。

獲取鎖lock2成功

此時再檢查鎖lock1是否空閒,獲取到值1,說明乙個連線只能持有乙個get_lock獲得的鎖,再獲取第二個鎖時第乙個鎖就會自動釋放

select release_lock(

'lock1'

);

此時釋放鎖lock1,返回null,說明鎖lock1不存在。

返回1說明鎖lock2釋放成功

下面建立兩個連線執行以下語句:

連線一中執行

select get_lock(

'lock',10

);

此時返回1說明連線1獲取鎖lock成功

然後在連線二中執行相同語句

select get_lock(

'lock',10

);

此時在十秒後返回0說明連線2獲取鎖lock失敗。

連線二中對lock鎖進行解鎖

select release_lock(

'lock'

);

返回0說明解鎖失敗,因為鎖是在連線一中建立的。

這時我們先在連線二中再次獲取鎖。

select get_lock(

'lock',10

);

此時連線二會阻塞十秒,連線二阻塞時我們在連線一中釋放鎖

select release_lock(

'lock'

);

此時返回1,說明連線一解鎖成功,連線一解鎖成功後,此時連線二就馬上解除了阻塞狀態

可以看到連線二在阻塞2.459秒後獲取到了鎖lock。

最後,我們驗證完了我們的測試,不要忘記在連線二中進行解鎖

select release_lock(

'lock'

);

MySQL中的SUBSTRING函式 的使用方法

mysql中,substring 是擷取字串函式 使用語法為 select substring str,pos select substring str from pos select substring str,pos,len select substring str from pos for l...

mysql裡面的外來鍵 mysql中的外來鍵使用

這兩天有人問mysql中如何加外來鍵,今天抽時間總結一下。mysql中myisam和innodb儲存引擎都支援外來鍵 foreign key 但是myisam只能支援語法,卻不能實際使用。下面通過例子記錄下innodb中外鍵的使用方法 建立主表 mysql create table parent i...

MYSQL函式group concat的使用

mysql函式group concat的使用 今天對一批資料要遷移轉換,查了下,有group concat這個函式簡單實現欄位的列轉行設定,過程記錄如下 一.測試資料準備 mysql use test database changed mysql select from t kenyon id 1 ...