[英]OrientDB keeps locking records indefinitely
我在具有多個節點的分布式模式下運行OrientDB(社區版本2.2.9)。
幾分鍾后,我的查詢開始出現以下錯誤:
com.orientechnologies.orient.server.distributed.task.ODistributedRecordLockedException: Timeout (1500ms) on acquiring lock on record #1010:2651. It is locked by request 3.1000 DB name="MyDatabase"
此實例中的查詢如下所示:
UPDATE #1010:2651 SET name='foo';
記錄保持鎖定狀態,直到重新啟動數據庫,我才能運行查詢。
如果不以分布式模式運行服務器,則不會收到此錯誤,因此它與以分布式模式運行服務器有關。
這是我的default-distributed-db-config.json
{
"autoDeploy": true,
"readQuorum": 1,
"writeQuorum": 1,
"executionMode": "asynchronous",
"readYourWrites": true,
"servers": {
"*": "master"
},
"clusters": {
"internal": {
},
"*": {
"servers": ["<NEW_NODE>"]
}
}
}
我在orientdb-server-config.xml中使用以下配置:
....
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
....
<parameter value="com.orientechnologies.orient.server.distributed.conflict.ODefaultReplicationConflictResolver" name="conflict.resolver.impl"/>
....
</parameters>
</handler>
...
通過從配置中刪除“ ODefaultReplicationConflictResolver ”參數,鎖定問題的發生頻率就會降低。
為什么記錄會像這樣鎖定,我該如何避免呢?
使用asynchronous
執行模式可能會導致此問題。 請參閱: 異步復制模式 。
您可以嘗試更改執行模式或嘗試向查詢中添加重試。 使用Java:通過以下OCommandSQL方法,可以在異步復制期間捕獲命令事件:
onAsyncReplicationOk()
,以在異步復制成功時捕獲事件 onAsyncReplicationError()
,以在異步復制返回錯誤時捕獲事件 在創建邊並發修改異常的情況下,最多重試3次的示例:
g.command( new OCommandSQL("create edge Own from (select from User) to (select from Post)")
.onAsyncReplicationError(new OAsyncReplicationError() {
@Override
public ACTION onAsyncReplicationError(Throwable iException, int iRetry) {
System.err.println("Error, retrying...");
return iException instanceof ONeedRetryException && iRetry<=3 ? ACTION.RETRY : ACTION.IGNORE;
}
})
.onAsyncReplicationOk(new OAsyncReplicationOk() {
System.out.println("OK");
}
).execute();
或在SQL Batch中添加重試:
begin
let upd = UPDATE #1010:2651 SET name='foo'
commit retry 100
return $upd
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.