MySQL對外提供了一種應用層級別的共享鎖,通過這個共享鎖,數據庫之上的應用程序可以實現互斥功能。這個共享鎖通過一組MySQL 內置函數實現。
GET_LOCK(
str
,timeout
) 這個函數的作用是獲取共享鎖,其中str是應用程序通信雙方協商好的一個字符串,timeout是等待該鎖的超時時間。如果能在timeout時間內獲取到鎖,則返回1;如果在timeout時間后仍然獲取不到鎖,則返回0;如果發生錯誤,則返回NULL。
一個應用程序獲取到鎖后,可以通過RELEASE_LOCK(
str
)、執行新的GET_LOCK(str,timeout)、或者mysql連接被釋放時(不管是正常釋放還是異常斷開)這三種方式釋放鎖。
如果有多個客戶端想去同時通過GET_LOCK(str, timeout)獲取鎖,則他們獲取鎖的先后順序不可知。
RELEASE_LOCK(
這個函數的作用是釋放名為str的共享鎖。如果鎖被成功釋放,返回1;如果這個進程沒有占有該鎖,則返回0;如果這個名為str的鎖不存在,則返回NULL。str
)
還有兩個函數,感覺用處不是很大:
IS_USED_LOCK(
str
)
檢查名為str的鎖是否在使用(被鎖),如果被鎖,則返回擁有該鎖的客戶端標識,否則返回NULL。
IS_FREE_LOCK(str)
檢查名為str的鎖是否可用(沒有被鎖),如果可用則返回1;如果在使用則返回0;如果有錯誤則返回NULL。
參考:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html