MariaDB / MySQL的GET_LOCK('lockname',0)如何工作?

时间:2018-08-16 10:58:56

标签: mysql mariadb

我发现我正在使用的Java应用程序中使用了MariaDB的GET_LOCK(‘lockname’, 0)

超时值在这里用作0。我想,它应该以非阻塞方式工作。但是,在日志文件中遇到一些异常之后,我有一种印象,即它仍在尝试使用默认超时时间来获取锁。在IS_FREE_LOCK(‘lockname’)调用之前应用GET_LOCK的调用可以使应用程序平稳运行。

我的问题是,在这里使用0作为超时值会有什么影响?

2 个答案:

答案 0 :(得分:0)

您确定超时了吗?我无法从命令行重现该问题:

会议1:

MariaDB [(none)]> SELECT GET_LOCK('lock1', 0.5);
+------------------------+
| GET_LOCK('lock1', 0.5) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.500 sec)

MariaDB [(none)]> SELECT GET_LOCK('lock1', 0);
+----------------------+
| GET_LOCK('lock1', 0) |
+----------------------+
|                    0 |
+----------------------+
1 row in set (0.000 sec)

会议2:

let r = /^20\.4\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;

let tests = [
  '20.4.0.1',
  '20.4.12.255',

  '20.4.256.255',
  '20.4.0.256',
  '120.4.0.1',
  '20.04.0.1',
  '200.4.0.1',
];

console.log(tests.map(ip => r.test(ip)))

答案 1 :(得分:0)

“锁定等待超时”与GET_LOCK无关。它仅适用于InnoDB事务。 innodb_lock_wait_timeout的默认值为50秒。 (我认为那太高了。)

InnoDB事务应设计为在几秒钟内完成。等待用户交互时,切勿使事务处于打开状态;上厕所休息可能会导致“锁定等待超时”。

我看到这是一个“ BatchUpdate”。这会加载大量数据吗?它来自某个缓慢的来源吗?您可以使用自动提交功能,而不将整个负载放入单个事务中吗?

另一件事...如果开始交易(BEGINSTART TRANSACTION),然后然后执行GET_LOCK('foo', 51),并且'foo'不可用,您要求“等待锁定超时”。

请提供更大的图片(批处理更新,GET_LOCK的原因等),以便我们进行更深入的研究。