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):
选择特定操作是否有任何指导或性能优势?什么是正确的方法?
注意:假设禁用了自动提交.
如果它只是一个选择,我不会打开交易,因此,在任何情况下都无事可做。也许您已经知道是否有更新/插入,因为您已经传递了参数。您打算进行操纵的情况更有趣。删除的情况很明显你想提交;如果出现异常,您应该回滚以保持数据库一致,因为出现故障并且您无能为力。如果删除失败是因为没有什么可删除的,我会出于以下 3 个原因进行提交:
从语义上讲,它似乎更正确,因为操作在技术上是成功的并且按照指定执行的。
它更具未来性,因此如果有人向事务添加更多代码,他们不会对事务回滚感到惊讶,因为一次删除并没有执行任何操作(他们会期望事务回滚)
当有操作要做时,提交速度更快,但在这种情况下我认为这并不重要。