MySQL get_lock

最近看到Shlomi Noach的blog,分布式系统如何来做并发控制,一般情况,我们往往会使用一个表的一个记录来表示资源是否可用,但有个评论提到用mysql的get_lock函数,以前一直没有关注这个函数,今天小试一把。

get_lock有三个返回值,成功:0;超时:1;异常:NULL.如果释放锁,可以调用released_lock

session 1:

root@(none) 03:01:53>SELECT GET_LOCK('a', 0);   
+------------------+
| GET_LOCK('a', 0) |
+------------------+
|                1 |
+------------------+

session 2:获取超时(第二个参数,指超时时间)

root@(none) 03:02:21>SELECT GET_LOCK('a', 0);   
+------------------+
| GET_LOCK('a', 0) |
+------------------+
|                0 |
+------------------+
root@(none) 03:02:27>SELECT GET_LOCK('a', 2);
+------------------+
| GET_LOCK('a', 2) |
+------------------+
|                0 |
+------------------+
1 row in set (2.00 sec)

session 1:

root@(none) 03:15:16>SELECT RELEASE_LOCK('a');
+-------------------+
| RELEASE_LOCK('a') |
+-------------------+
|                 1 |
+-------------------+

session 2:

root@(none) 03:15:18>SELECT GET_LOCK('a', 0);
+------------------+
| GET_LOCK('a', 0) |
+------------------+
|                1 |
+------------------+

所以在设计系统时,也可以考虑这种轻便方式来实现并发控制。

更多参考:
http://www.xaprb.com/blog/2006/07/26/how-to-coordinate-distributed-work-with-mysqls-get_lock/
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock


Post a Comment