我发现了 GET_LOCK(‘lockname’, 0) 我正在开发的java应用程序中的mariadb。超时值在这里用作0。我想它应该以非阻塞的方式工作。但是,在日志文件中获得一些异常之后,我得到的印象是,它仍在尝试使用默认超时时间获取锁。应用调用 IS_FREE_LOCK(‘lockname’) 之前 GET_LOCK 调用可以使应用程序顺利运行。我的问题是,在这里使用0作为超时值有什么影响?
GET_LOCK(‘lockname’, 0)
IS_FREE_LOCK(‘lockname’)
GET_LOCK
dxxyhpgq1#
你确定超时了吗?。我无法从命令行重现问题:第1部分:
MariaDB [(none)]> SELECT GET_LOCK('lock1', 10); +-----------------------+ | GET_LOCK('lock1', 10) | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.000 sec)
第2部分:
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)
pieyvz9o2#
“锁等待超时”与 GET_LOCK . 它只适用于innodb事务。的默认值 innodb_lock_wait_timeout 是50秒(在我看来,这个数字太高了。)innodb事务应该设计成在几秒钟内完成。永远不要在等待用户交互时打开事务;上厕所休息可能导致“锁等待超时”。我看到这是一个“批量更新”。这是不是加载了很多数据?是不是有点慢?你能不能使用自动提交,而不是把整个负载放在一个事务中?另一件事。。。如果你开始交易( BEGIN 或者 START TRANSACTION ),然后做 GET_LOCK('foo', 51) ,并且“foo”不可用,您要求的是“等待锁定超时”。请提供更大的图片(批量更新,获取\锁定的原因等),以便我们可以深入挖掘。
innodb_lock_wait_timeout
BEGIN
START TRANSACTION
GET_LOCK('foo', 51)
2条答案
按热度按时间dxxyhpgq1#
你确定超时了吗?。我无法从命令行重现问题:
第1部分:
第2部分:
pieyvz9o2#
“锁等待超时”与
GET_LOCK
. 它只适用于innodb事务。的默认值innodb_lock_wait_timeout
是50秒(在我看来,这个数字太高了。)innodb事务应该设计成在几秒钟内完成。永远不要在等待用户交互时打开事务;上厕所休息可能导致“锁等待超时”。
我看到这是一个“批量更新”。这是不是加载了很多数据?是不是有点慢?你能不能使用自动提交,而不是把整个负载放在一个事务中?
另一件事。。。如果你开始交易(
BEGIN
或者START TRANSACTION
),然后做GET_LOCK('foo', 51)
,并且“foo”不可用,您要求的是“等待锁定超时”。请提供更大的图片(批量更新,获取\锁定的原因等),以便我们可以深入挖掘。