我在 javascript 中遇到了 gremlin 事务的一些行为,并且我的 websocket 连接被卡在打开状态。我读过
https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-transactions.html https://docs.aws.amazon.com/neptune/latest/userguide/best-practices-gremlin-java-close-connections.html https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions.html
但我不能 100% 确定正在发生的事情或我应该对交易及其行为做什么。根据文档,似乎在 lambda 环境中,我不调用
await dc.close()
在本地,我只是运行
node testNeptune
。此代码在本地使所有写入都失败
const makeHangingTransaction = async function () {
let dc = new DriverRemoteConnection(
'<myurl>',
{ pingInterval: 5000, pingTimeout: 5000 }
);
let graph = new Graph();
let g = graph.traversal().withRemote(dc);
await dropAll(g);
let tx = g.tx();
let gtx = tx.begin();
try {
console.log('transaction test1');
console.log(await gtx.addV('person').next());
console.log(await gtx.V().toList());
console.log();
await tx.commit();
} finally {
tx.close();
}
try {
console.log('transaction test1');
console.log(await gtx.addV('person').next());
console.log(await gtx.V().toList());
console.log();
await tx.commit();
} finally {
tx.close();
}
};
makeHangingTransaction();
脚本运行,然后以
Error: Connection has been closed.
结束;我的猜测是 tx.close() 关闭,然后“父”dc 连接本身就会终止并抛出此错误,而不会终止实际的 websocket 连接。我知道 tx.close() 应该等待。
这会创建一个“挂起”事务,我无法再从任何地方执行任何写入命令;我的 aws jupyter 和 local 都会挂起,然后失败并显示
Failed to complete Insert operation for a VertexProperty due to conflicting concurrent operations. Please retry. 0 transactions are currently rolling back
。在 websocket(?) 超时之前我必须等待几分钟才能再次写入。
问题:
await dc.close()
。谢谢
希望以下注释可以帮助您解决当前的问题:
对于 #1 - 您可以通过 Gremlin Status API 和查询取消 API 取消正在进行的查询/交易:https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-api-status-取消.html
对于#2 - 这最终取决于数据库中锁定的内容以及是否遇到死锁情况。这包括根据 Neptune 的索引结构采取的间隙锁。以下是更广泛的解释:https://docs.aws.amazon.com/neptune/latest/userguide/transactions-neptune.html#transactions-neptune-false-conflicts
对于 #3 和 #4 - 您不需要“关闭”交易。提交就足够了,如果提交失败,事务会自动回滚。如此处所述:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-transactions.html#access-graph-gremlin-transactions-session-bound您可以强制回滚如果您到达事务仍处于打开状态的代码部分,并且您希望在此时提交事务。
如果您使用 AWS Lambda,通常的良好做法是在 Lambda 处理程序外部建立连接,并假设该连接始终对任何后续 Lambda 函数调用打开。这减少了每次调用时打开/关闭连接的开销。可以在这里找到与 Neptune 一起使用的结构良好的 Javascript Lambda 函数的良好起点:https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions-examples.html#lambda-functions -示例-javascript。这包括使用 Neptune 的基于 Lambda 的应用程序通常需要的异常处理、重试和重新连接逻辑。