2010-09-02 68 views
1

我在http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html 当回滚JDBC事务

有趣的部分是读一本有趣的说法是:

“捉一个SQLException告诉你,什么是错的,但它不会告诉你是或不是因为你不能指望什么都没有提交,所以调用方法回滚是唯一确定的方法。“

这是真的吗?如果我没有调用commit,但是我得到了一个SQLException,那么我能否指望没有提交任何内容?如果我的程序退出而没有调用commit或rollback会怎么样?我认为交易会自动回滚给我,但这种说法带走了我的确定性。

+0

@GyozoGasper:其实它已经发生在我身上。我正在使用jdbc和postgresql。 – Ashwin 2012-06-06 10:01:19

回答

1

基本上任何现代数据库,你会考虑在其默认隔离级别使用不会出现这种行为。但是最终,JDBC发生了什么事情是不能控制的,尽管它知道你可能会使用Informix 5或带有低价层的1988 Sybase。

因此,从高级语言API规范的角度来看,他们必须声明,如果不正确地使用它,没有任何保证。基本上它是说如果放弃连接既不是提交也不是回滚导致某些执行语句在数据库级别中出现的结果,则它将不被视为在JDBC级别处的错误。 (通常对于大多数数据库,我们认为数据库级别的缺陷,但是JDBC又是一个高级API。)

0

你可以测试一下看看会发生什么。

我会推荐使用这个东西的春天。它会自动处理您的tx回滚。

+0

即使一个测试表明一切都好,我仍然可能是错误的,仍然可以做错误的方式。积极的测试只意味着在现实生活中它运行良好,但并不意味着在任何情况下都能正常工作。在某些情况下,它仍然可能失败。如果我必须将我的数据库更改为其他引擎,该怎么办?我的程序是否可以在Oracle ISAM表上进行测试?只有在理论上正确并经过测试时,我才相信我的代码。仅经过测试的代码稍后可能会失败。 – 2010-09-02 20:06:10