首页 > 解决方案 > ScalarDB 何时以及为何抛出 UnknownTransactionStatusException

问题描述

从示例https://github.com/indetail-blockchain/getting-started-with-scalardb中,transaction.commit 可以抛出两个异常

• CommitException,表示提交失败。在这种情况下,建议使用 transaction.abort() 回滚事务 • UnknownTransactionStatusException 表示事务提交处于未知状态。它可能已经提交,也可能没有。

  1. abort 是否保证回滚?

  2. 在什么情况下会抛出 UnknownTransactionStatusException?

  3. 如果抛出 UnknownTransactionStatusException 有什么补救措施?我应该叫中止吗?这会保证回滚到以前的一致状态吗?

标签: scalardb

解决方案


  1. abort 是否保证回滚?

实际上在当前基于 Snapshot Isolation 的实现中, abort()并不是真正需要的,所以正如您所看到的代码,abort()什么也不做。

https://github.com/scalar-labs/scalardb/blob/master/src/main/java/com/scalar/db/transaction/consensuscommit/ConsensusCommit.java#L126

要中止,您只需在调用commit(). 在这种情况下,存储中没有任何反应,因此看起来它已正确回滚。

如果您已经调用过commit(),它是否会真正提交或中止取决于事务的突变和存储可用性。如果一切顺利,它将承诺。如果它面临一些冲突或失败,它将被中止。在任何情况下,它最终都会被提交(前滚)或中止(回滚)。

  1. 在什么情况下会抛出 UnknownTransactionStatusException?

有时它无法识别事务是提交还是中止,例如,由于系统中的某些灾难性故障,并且UnknownTransactionStatusException在这种情况下被抛出。

  1. 如果抛出 UnknownTransactionStatusException 有什么补救措施?我应该叫中止吗?这会保证回滚到以前的一致状态吗?

UnknownTransactionStatusException被抛出时,除了等待状态确定之外,您无能为力。您可以调用TransactionService.getState()以检查事务最终是否已提交或中止。

https://github.com/scalar-labs/scalardb/blob/master/src/main/java/com/scalar/db/service/TransactionService.java#L70


推荐阅读