概要描述
argodb锁的问题比较常见,最常遇到的报错就是下图中的报错,need wait lock holders:xxx, id:yyy, process lock conflict failed, check and do acquire write locks failed
详细介绍
一. 如何判断这个事务是什么占用的?
报错顾名思义,当前事务id为 yyy,需要等待事务id为 xxx 的释放掉 才能继续执行。
此时我们可以根据 事务id为xxx 在Query页面进行查询,找到占用锁的sql语句。
需要注意的是,如果集群安装了多个quark/compactservice,那么每个都要去查询,一般都能够找到对应占用的sql语句。
二. dbaservice页面找不到怎么办?
如果还是找不到,可以参考如下两种方式获取线索,以 UPDATE dsy.SYS_SMS_BATCH SET XXDM='abcd' WHERE ZJSJWYXBS = '1' 这个sql为例:
a) 登录到tddms master leader节点所在后台服务器,通过类似如下的命令检索 master_main.INFO 日志
[root@kv2/var/log/tddms1]> grep -E 'AcquireLocksProposal.*#140862' master_main.kv2.root.log.INFO.20260826-100830.1
I20260910 09:18:41.375291 38 metadb.cc:222] fire callback for proposal:Name:AcquireLocksProposal:kMutate#140862#default#dsy.sys_sms_batch_d93381a3-4533-4e75-8be9-b532af95a679, IsAccepted:true, HasRpcContext:true
I20260910 09:18:41.522189 38 metadb.cc:222] fire callback for proposal:Name:AcquireLocksProposal:kRead#140862#default#dsy.sys_sms_batch_d93381a3-4533-4e75-8be9-b532af95a679, IsAccepted:true, HasRpcContext:true
可以看到这个sql语句,在 20260910 09:18:41 左右,先后获取了 Mutate 和 Read 锁。结合 Argodb 常见sql对应的锁类型 能够大致判断出是执行了什么sql语句触发的。
b) 登录到dbaservice服务节点所在后台服务器 $dbaservice.persistence.datadir 目录,通过类似如下的命令检索sql语句
[root@kv4/mnt/disk3/dbaservice/dbaservice2/tmp/preserve/20260910]> ls -l
总用量 12
drwxr-xr-x 9 root root 4096 9月 10 00:01 argodbbar1@172.18.131.171:18898
drwxr-xr-x 8 root root 4096 9月 10 09:19 compactservice1@172.18.131.171:4050
drwxr-xr-x 9 root root 4096 9月 10 00:01 quark1@172.18.131.171:8888
[root@kv4/mnt/disk3/dbaservice/dbaservice2/tmp/preserve/20260910]> grep 140862 -R *
可以看到对应的完整sql:

三.如何通过API获取锁信息并杀锁
# host为 TDDMS Webserver 节点的ip
# 获取当前集群中事务信息,默认获取活跃事务:
curl -u shiva:shiva -XGET ':/bulk_transaction?[pretty]'
# 强制终止一个活跃事务:
curl -u shiva:shiva -XDELETE ":/bulk_transaction/"
# 另一种方案,dbaservice 会话页面关闭占用锁的session,简单粗暴
如果报错
NEGOTIATED_ROLE_NOT_EXIST,需要加上-u shiva:shiva![]()
举例说明
1、创建测试表
DROP TABLE IF EXISTS EMP_HOLO;
CREATE TABLE EMP_HOLO(
EMPNO int,
ENAME string,
JOB string,
MGR INT,
HIREDATE DATE,
SAL INT,
COMM INT,
DEPTNO INT
)CLUSTERED BY (empno) INTO 3 BUCKETS
STORED AS HOLODESK;
INSERT INTO EMP_HOLO VALUES (7369,'SMITH','CLERK',7902,tdh_todate('17-12-1980','dd-mm-yyyy'),800,NULL,20);
2、执行锁语句,delete操作
CREATE SEQUENCE test_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOMINVALUE
NOCYCLE
CACHE 20;
set transaction.type=holodesk;
BEGIN
begin transaction;
--前后分别通过sequence值来标记执行顺序
SELECT test_seq.NEXTVAL FROM system.dual;
--Action
DELETE FROM EMP_HOLO WHERE ENAME ='SMITH';
--通过睡眠函数控制执行顺序
dbms_lock.sleep(600);
--前后分别通过sequence值来标记执行顺序
SELECT test_seq.NEXTVAL FROM system.dual;
commit;
END
执行上述plsql块之后,一直处于运行状态。
3、检查活跃事务信息:
可以在DBAService的Query页面,获取到 阻塞事务id ,再结合delete 请求结束。
通过 API 也可以获取到当前所有活跃的事务信息:
[root@argodb1~]$ curl -u shiva:shiva -XGET '172.22.23.1:4567/bulk_transaction?pretty'
{
"log_id" : 1676003325746,
"code" : 0,
"msg" : "ok",
"transaction_ids" : [ 1493 ],
"status" : [ "kActiveBulkTransaction" ],
"bulk_transaction_descriptions" : [ {
"id" : 1493,
"status" : "kActiveBulkTransaction",
"read_write_tables" : [ {
"table_id" : 24,
"bulk_loads" : [ {
"bulk_load_id" : 1478,
"section_names" : [ "default.emp_holo_3b71d992-e5b5-4bc2-940e-63233830e8cf" ]
} ],
"bulk_reads" : [ {
"section_name" : "default.emp_holo_3b71d992-e5b5-4bc2-940e-63233830e8cf",
"read_num" : 2
} ],
"schema_version" : 3
} ],
"policy_version" : 0,
"retain_si_read" : false,
"gcable" : false,
"creator" : {
"address" : "172.22.23.1:37463",
"log_id" : 1676007619045
}
} ]
}
这个因为是手动开启事务,所以在begin transaction的时候事务ID就已经确定了.
4、手动终止事务
a. 从前面的结果可以看到 "status" : [ "kActiveBulkTransaction" ]ACTIVE 状态的话,可以通过下面的方式终止:
强行结束事务kActive状态事务
# IP和PORT按照tddms webui
# curl -u shiva:shiva -XDELETE "IP:PORT/bulk_transaction/"
curl -u shiva:shiva -XDELETE "172.22.23.1:4567/bulk_transaction/1493"
{"log_id": 1676003325954,"code": 0,"msg": "bulk transaction:1494 is aborted"}
b. 如果事务状态是 "status" : [ "kWaitingBulkTransaction" ] WAITING 状态的话,可以使用下面命令强行终止
强行结束事务kwaitting状态事务
# IP和PORT按照tddms webui
# curl -u shiva:shiva -XPOST "IP:PORT/bulk_transaction/terminate/"
curl -u shiva:shiva -XPOST "172.22.23.1:4567/bulk_transaction/terminate/123788"
c. 如果事务状态是 "status" : [ "kAbortedBulkTransaction" ] ABORTED 状态的话,代表已终止的事务,无须处理