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。
在同一个连接中顺序执行以下语句:
SELECT IS_FREE_LOCK('lock1');
返回结果为1说明锁lock1尚未被使用
SELECT IS_USED_LOCK('lock1');
返回结果为NULL说明锁lock1尚未被使用
SELECT GET_LOCK('lock1',10);
返回结果为1说明该链接获取锁lock1成功
SELECT IS_FREE_LOCK('lock1');
返回结果为0说明锁lock1正在被使用
SELECT IS_USED_LOCK('lock1');
返回11说明锁正在被连接ID为11的连接使用
SELECT GET_LOCK('lock1',10);
返回1说明同一个连接中锁lock1不进行释放但获取锁lock1依然会成功。
SELECT GET_LOCK('lock2',10);
获取锁lock2成功
SELECT IS_FREE_LOCK('lock1');
此时再检查锁lock1是否空闲,获取到值1,说明一个连接只能持有一个GET_LOCK获得的锁,再获取第二个锁时第一个锁就会自动释放
SELECT RELEASE_LOCK('lock1');
此时释放锁lock1,返回NULL,说明锁lock1不存在。
SELECT RELEASE_LOCK('lock2');
返回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');