mariadb/mysql的get\u lock('lockname',0)是如何工作的?

fumotvh3  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(299)

我发现了 GET_LOCK(‘lockname’, 0) 我正在开发的java应用程序中的mariadb。
超时值在这里用作0。我想它应该以非阻塞的方式工作。但是,在日志文件中获得一些异常之后,我得到的印象是,它仍在尝试使用默认超时时间获取锁。应用调用 IS_FREE_LOCK(‘lockname’) 之前 GET_LOCK 调用可以使应用程序顺利运行。
我的问题是,在这里使用0作为超时值有什么影响?

dxxyhpgq

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)
pieyvz9o

pieyvz9o2#

“锁等待超时”与 GET_LOCK . 它只适用于innodb事务。的默认值 innodb_lock_wait_timeout 是50秒(在我看来,这个数字太高了。)
innodb事务应该设计成在几秒钟内完成。永远不要在等待用户交互时打开事务;上厕所休息可能导致“锁等待超时”。
我看到这是一个“批量更新”。这是不是加载了很多数据?是不是有点慢?你能不能使用自动提交,而不是把整个负载放在一个事务中?
另一件事。。。如果你开始交易( BEGIN 或者 START TRANSACTION ),然后做 GET_LOCK('foo', 51) ,并且“foo”不可用,您要求的是“等待锁定超时”。
请提供更大的图片(批量更新,获取\锁定的原因等),以便我们可以深入挖掘。

相关问题