Java:语义不变时提交vs回滚vs什么都没有?

eol*_*old 8 java sql database transactions jdbc

好的,我知道提交和回滚之间的区别以及这些操作应该做什么.但是,在使用commit(),rollback()和/或什么都不做的情况下我可以实现相同的行为时,我不确定该怎么做.

例如,假设我有以下代码执行查询而无需写入db:我正在处理与SQLite数据库通信的应用程序.

try {
  doSomeQuery()
  // b) success
} catch (SQLException e) {
  // a) failed (because of exception)
}
Run Code Online (Sandbox Code Playgroud)

或者更有趣的是,请考虑以下代码,它会删除一行:

try {
  if (deleteById(2))
    // a) delete successful (1 row deleted)
  else
    // b) delete unsuccessful (0 row deleted, no errors)
} catch (SQLException e) {
  // c) delete failed (because of an error (possibly due to constraint violation in DB))
}
Run Code Online (Sandbox Code Playgroud)

从语义角度观察,在b)和c)情况下进行提交或回滚会导致相同的行为.

通常,每种情况下都有几种选择(a,b,c):

  • 承诺
  • 回滚
  • 没做什么

选择特定操作是否有任何指导或性能优势?什么是正确的方法?

注意:假设禁用了自动提交.

Lui*_*uis 2

如果它只是一个选择,我不会打开交易,因此,在任何情况下都无事可做。也许您已经知道是否有更新/插入,因为您已经传递了参数。您打算进行操纵的情况更有趣。删除的情况很明显你想提交;如果出现异常,您应该回滚以保持数据库一致,因为出现故障并且您无能为力。如果删除失败是因为没有什么可删除的,我会出于以下 3 个原因进行提交:

  • 从语义上讲,它似乎更正确,因为操作在技术上是成功的并且按照指定执行的。

  • 它更具未来性,因此如果有人向事务添加更多代码,他们不会对事务回滚感到惊讶,因为一次删除并没有执行任何操作(他们会期望事务回滚)

  • 当有操作要做时,提交速度更快,但在这种情况下我认为这并不重要。