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
- 修改 server 中执行任务的逻辑,确保他们不会同时修改同一个分区。
- 通过
setAtomicLevel
函数,将数据库的 atomic 级别设置为 CHUNK。此后,当写入事务涉及的某些分区发生冲突时,会自动完成对未冲突分区的写入,然后在一段时间内不断尝试写入冲突分区。注: 这样操作可能会导致一次写入被拆分成多次事务。