S00002

错误代码

S00002

报错信息

The openChunks operation failed because the chunk <xxx> is currently locked and in use by transaction <tid>. RefId:S00002

错误原因

当事务尝试获取涉及分区的分布式锁时,如果发现这个分区的分布式锁已被其他事务持有,系统会抛出该错误,并提示被锁定的分区以及锁定该分区的事务,尝试获取被锁定的分区的分布式锁的事务会失败。

解决办法

DolphinDB 支持事务,确保事务的原子性,一致性,隔离性和持久性。每次进行增加、删除或修改的操作,DolphinDB 都会创建一个事务,对相应的分区进行锁定。 当多个 writer 并行写入数据时,避免同时对同一个分区进行增加、删除或修改的操作。

例如,以下脚本提交两个任务同时写入分区1,2 和 3:

login(`admin, `123456)
dbpath="dfs://testDB"
tbname="tb";
if(existsDatabase(dbpath))
	dropDatabase(dbpath);
db=database(dbpath,VALUE,1..2);
dumyTable=table(1..3 as id, 1..3 as val);
tb=createPartitionedTable(db,dumyTable,"tb", "id");

def Job(dbPath, tbName) {
	for(i in 1..100) {
		dumyTable=table(1..3 as id, 1..3 as val)
		tb = loadTable(dbPath, tbName)
		t = table(1..3 as id, 1..3 as val);
		tb.append!(t)
	}
}

submitJob("job1", "", Job, dbpath, tbname)
submitJob("job2", "", Job, dbpath, tbname)

getRecentJobs()
执行 getRecentJobs 时遇到报错:
<ChunkInTransaction>The openChunks operation failed because the chunk '/testDB/1/2' is
        currently locked and in use by transaction 8. RefId:S00002
  1. 修改 server 中执行任务的逻辑,确保他们不会同时修改同一个分区。
  2. 通过 setAtomicLevel 函数,将数据库的 atomic 级别设置为 CHUNK。此后,当写入事务涉及的某些分区发生冲突时,会自动完成对未冲突分区的写入,然后在一段时间内不断尝试写入冲突分区。
    注: 这样操作可能会导致一次写入被拆分成多次事务。