24.5用户级锁

用户级锁由SQL函数控制

GET_LOCK(str,timeout) IS_FREE_LOCK(str) IS_USED_LOCK(str) RELEASE_LOCK(str

它们可以用于SQL语句接受SQL函数的地方。根据它们在select、update或其他语句的选择列表、where子句、group by子句等中的外观,这些语句可以在不同的代码点被阻塞。可阻塞位置的集合是有限的。然而,一些同步问题可以用用户级锁解决。

例子:

使用InnoDB表,innodb_lock_wait_timeout=1秒——connection conn1 #在t1上获取共享锁。锁表t1 SHARE MODE——connection conn2 #获取用户级锁“mysqltest1”。SELECT GET_LOCK("mysqltest1", 10);# INSERT必须在后台等待t1上的SQL锁消失。INSERT INTO t1 VALUES (1)——connection conn1 #在后台等待,直到插入超时并释放#用户级锁。然后Conn1将拥有锁。SELECT GET_LOCK("mysqltest1", 10); --connection conn2 # Wait for INSERT to timeout. --error ER_LOCK_WAIT_TIMEOUT reap; # Now let conn1 get the lock and continue. SELECT RELEASE_LOCK("mysqltest1"); COMMIT; --connection conn1 reap; # We do not need the lock any more. SELECT RELEASE_LOCK("mysqltest1"); # Commit releases the share lock on t1. COMMIT;

Martin Friebe写了一篇关于用户级锁可能用途的好文章。MySQL内部邮件列表,2007年12月10日:http://lists.10bet靠谱mysql.com/internals/35220

用户级锁的一个限制是,一个线程一次只能拥有一个锁。这将该方法限制在相对简单的情况下。