我发现我正在使用的Java应用程序中使用了MariaDB的GET_LOCK(‘lockname’, 0)
。
超时值在这里用作0。我想,它应该以非阻塞方式工作。但是,在日志文件中遇到一些异常之后,我有一种印象,即它仍在尝试使用默认超时时间来获取锁。在IS_FREE_LOCK(‘lockname’)
调用之前应用GET_LOCK
的调用可以使应用程序平稳运行。
我的问题是,在这里使用0作为超时值会有什么影响?
答案 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”。这会加载大量数据吗?它来自某个缓慢的来源吗?您可以使用自动提交功能,而不将整个负载放入单个事务中吗?
另一件事...如果开始交易(BEGIN
或START TRANSACTION
),然后然后执行GET_LOCK('foo', 51)
,并且'foo'不可用,您要求“等待锁定超时”。
请提供更大的图片(批处理更新,GET_LOCK的原因等),以便我们进行更深入的研究。