何时回滚 jdbc 事务
Posted
技术标签:
【中文标题】何时回滚 jdbc 事务【英文标题】:when to roll back a jdbc transaction 【发布时间】:2010-09-02 19:11:18 【问题描述】:我在http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html 看到了一个有趣的声明
有趣的是:
“捕获一个 SQLException 会告诉您有问题,但它不会告诉您什么已提交或未提交。由于您不能指望什么都没有提交,因此调用方法回滚是确定的唯一方法。”
真的是这样吗?如果我不调用 commit 但我得到一个 SQLException 那么我不能指望什么都没有提交吗?如果我的程序没有调用 commit 或 rollback 就退出了怎么办?我以为事务会为我自动回滚,但这个陈述让我失去了确定性。
【问题讨论】:
@GyozoGasper :实际上它发生在我身上。我正在使用 jdbc 和 postgresql。 【参考方案1】:基本上,您考虑在其默认隔离级别中使用的任何现代数据库都不会出现这种行为。但最终,那里发生的事情超出了 JDBC 的控制,而且它知道您可能正在使用 Informix 5 或 1988 Sybase,并在引擎盖下有一个 adaper 层。
因此,从高级语言 API 规范的角度来看,他们必须声明,如果您不正确使用它,则无法保证任何事情。基本上它的意思是,如果在既没有提交也没有回滚的情况下放弃连接的结果导致一些已执行的语句出现在数据库级别,则它不会被视为 JDBC 级别的错误。 (通常对于大多数数据库,我们会考虑数据库级别的错误,但同样,JDBC 是一个高级 API。)
【讨论】:
【参考方案2】:你可以测试一下看看会发生什么。
我建议使用 Spring 来处理这些东西。它将自动为您处理您的 tx 回滚。
【讨论】:
即使测试显示一切正常,我仍然可能是错误的,并且仍然可以以错误的方式进行操作。阳性测试仅意味着在现实生活中它可以正常工作,但并不意味着它在所有情况下都可以正常工作。在某些情况下,它仍然可能失败。如果我必须将我的数据库更改为其他引擎怎么办?我使用 Oracle 测试的程序是否也可以在 mysql ISAM 表上运行?只有在理论上正确并经过测试时,我才会相信我的代码。仅经过测试的代码以后更有可能失败。以上是关于何时回滚 jdbc 事务的主要内容,如果未能解决你的问题,请参考以下文章