scalardb - ScalarDB 何时以及为何抛出 UnknownTransactionStatusException
问题描述
从示例https://github.com/indetail-blockchain/getting-started-with-scalardb中,transaction.commit 可以抛出两个异常
• CommitException,表示提交失败。在这种情况下,建议使用 transaction.abort() 回滚事务 • UnknownTransactionStatusException 表示事务提交处于未知状态。它可能已经提交,也可能没有。
abort 是否保证回滚?
在什么情况下会抛出 UnknownTransactionStatusException?
如果抛出 UnknownTransactionStatusException 有什么补救措施?我应该叫中止吗?这会保证回滚到以前的一致状态吗?
解决方案
- abort 是否保证回滚?
实际上在当前基于 Snapshot Isolation 的实现中,
abort()
并不是真正需要的,所以正如您所看到的代码,abort()
什么也不做。
要中止,您只需在调用commit()
. 在这种情况下,存储中没有任何反应,因此看起来它已正确回滚。
如果您已经调用过commit()
,它是否会真正提交或中止取决于事务的突变和存储可用性。如果一切顺利,它将承诺。如果它面临一些冲突或失败,它将被中止。在任何情况下,它最终都会被提交(前滚)或中止(回滚)。
- 在什么情况下会抛出 UnknownTransactionStatusException?
有时它无法识别事务是提交还是中止,例如,由于系统中的某些灾难性故障,并且UnknownTransactionStatusException
在这种情况下被抛出。
- 如果抛出 UnknownTransactionStatusException 有什么补救措施?我应该叫中止吗?这会保证回滚到以前的一致状态吗?
当UnknownTransactionStatusException
被抛出时,除了等待状态确定之外,您无能为力。您可以调用TransactionService.getState()
以检查事务最终是否已提交或中止。
推荐阅读
- azure - 是否有内置方法可以将集合复制到同一区域中的“追随者”集合?
- javascript - 为什么 JavaScript 的 bind() 不能像我预期的那样在这里工作?
- linux - AWS EC2 上的粘性弹性 IP
- excel - Excel 的 SELECT 或 WORKSHEET 有问题。不知道为什么
- angular - 使用 eslint-plugin-angularjs-security-rules 的项目无法使用 Angular 6 中的 eslint 扫描文件以查找错误
- python - 为什么在 t1 完成之前等待不会阻止 t2 执行?
- node.js - 直播间如何“实时截图”
- javascript - 如何通过来自另一个对象数组的数据过滤对象数组?
- ios - Xcode请求我在函数中没有定义参数标签时使用?
- python - 在python中同一类的实例之间共享变量