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