南大通用GBase 8a集群并发时锁等待超时参数gcluster_lock_timeout,Can't lock table报错

GBase 8a数据库集群内部,通过锁机制来实现资源的并行操作,其等待超时参数通过gcluster_lock_timeout设置,默认是0一直等待。

本文介绍的是集群锁报错,如果是计算节点报错的(报错信息里有IP:5050字样), 请参考 GBase 计算节点表锁超时参数table_lock_wait_timeout

如果开启了事务

那么当多个session同时操作一个表时,或者你在一个session里对表做了多次DML等操作,就会报这类错误了。 请关闭事务功能。

(GBA-02LO-0002) Can't lock file(already exists).
gbase> set autocommit=0;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> select * from t1;
+------+-------+-------+
| id   | value | birth |
+------+-------+-------+
|    1 |   234 | NULL  |
|    2 |   567 | NULL  |
|    3 |   888 | NULL  |
|    4 |   999 | NULL  |
+------+-------+-------+
4 rows in set (Elapsed: 00:00:00.00)

gbase> update t1 set birth=now();
Query OK, 4 rows affected (Elapsed: 00:00:00.03)
Rows matched: 4  Changed: 4  Warnings: 0

gbase> update t1 set birth=now();
ERROR 1709 (HY000): [10.0.2.107:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: Can't lock table: testdb.t1 (errno: 1)
SQL: /*::ffff:10.0.2.107_243_35_2020-09-04_19:03:40*/ UPDATE `testdb`.`t1_n1` `testdb.t1` SET `testdb.t1`.`birth` = to_date('2020-09-04 19:03:40', 'YYYY-MM-DD HH24:MI:SS');
gbase>

参数

gcluster_lock_timeout

集群层参数,一个dml等语句运行前要获得集群对目标表的锁。

默认值

为0,表示一直等待直到获得锁。

单位为秒。支持session级变量

样例

set gcluster_lock_timeout=5

insert into t1 select * from b

如果超过5秒没有获得锁,则报错显示无法获得锁的错误信息

报错信息类似:

ERROR 1727 (HY000): try to lock in gcluster failed: (GBA-02LO-0002) Failed to lock: [testdb.t1580D5F90-B287-4199-B057-E6FBD44B5BFA] GC_AIS_ERR_TIMEOUT