- 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(),它是否会真正提交或中止取决于事务的突变和存储可用性。如果一切顺利,它将承诺。如果它面临一些冲突或失败,它将被中止。在任何情况下,它最终都会被提交(前滚)或中止(回滚)。
- 在什么情况下会抛出 UnknownTransactionStatusException?
有时它无法识别事务是提交还是中止,例如,由于系统中的某些灾难性故障,并且UnknownTransactionStatusException在这种情况下被抛出。
- 如果抛出 UnknownTransactionStatusException 有什么补救措施?我应该叫中止吗?这会保证回滚到以前的一致状态吗?
当UnknownTransactionStatusException被抛出时,除了等待状态确定之外,您无能为力。您可以调用TransactionService.getState()以检查事务最终是否已提交或中止。
https://github.com/scalar-labs/scalardb/blob/master/src/main/java/com/scalar/db/service/TransactionService.java#L70