2015-06-02 85 views
1

我连接到Oracle Java程序,并执行以下操作发生在我的JDBC事务是什么:如果我失去了我的会议

  • 启动会议

  • 开始交易

  • 插入一堆行,调用存储过程等。

  • 提交事务

  • 结束会话

左右。 。 。如果在交易过程中我失去了会话(由于网络问题或某种程度的原因)会发生什么?我是否会自动回滚?交易超时后我会回滚吗?我担心我的数据库将处于不一致的状态,直到甲骨文开始清理。

+0

我很担心行被锁定的交易,并没有被释放,直到甲骨文注意到我的会议不见了,继续前进并为我回滚。注意我很不确定,这就是为什么我问。 。 。 – akaioi

+0

http://stackoverflow.com/questions/5932437/oracle-user-disconnected-without-committing-rolling-back-not-longer-can-change – OldProgrammer

+0

相关:[Oracle用户断开连接而不提交/回滚,不再可以更改数据库](http://stackoverflow.com/questions/5932437/oracle-user-disconnected-without-committing-rolling-back-not-longer-can-change)和[关闭连接上的JDBC事务回滚失败](http ://stackoverflow.com/questions/27449974/jdbc-transaction-rollback-failure-on-closed-connection)。 – sleske

回答

1

如果在执行事务期间会话丢失,Oracle数据库将自动回滚您的更改。您可以在文档中阅读有关Statement level atomicity的更多信息。如果由于网络问题而导致事务丢失,则通常会得到ORA-03113: end-of-file on communication channel,并且事务已在数据库上回滚。

但是,只有当数据库服务器上的会话丢失时才会出现这种情况。特别是对于分布式事务(XA),当JDBC会话结束时,数据库事务通常保持活动状态,因此当您有XA事务时,请注意这一点。

还要注意在JDBC驱动程序中默认打开的自动提交。这会自动提交您执行的每个操作,因此如果您的事务处理时间较长(说10个插入并且您的第9个插入失败),插入1 - 8将自动提交并且不会再回滚。自动提交可以通过Connection.setAutoCommit(false);被关闭,见setAutoCommit in the JDBC API documentation

+1

关于自动提交的好处。请注意,如果您使用实现JPA(Java持久性API)的ORM(例如Hibernate或EclipseLink),则自动提交将自动关闭,并覆盖由JDBC设置的默认值。 – sleske

0

如果我失去了我的会话(由于网络问题或 有点)在交易的中间发生了什么?

究竟发生了什么取决于您使用的数据库系统(DBMS)及其配置。但大多数DBMS,特别是Oracle,都配置了超时(或多个超时)。如果超时过期,事务将被回滚。

尤其是Oracle,DBA可以列出Oracle服务器上的打开会话,甚至可以在超时过期之前强制终止会话。结果将是相同的:被终止的会话内的任何挂起的事务将被回滚。

我担心我的数据库将处于不一致的状态,直到甲骨文得到清理。

这取决于您所指的“不一致状态”以及您所使用的事务隔离级别。只要事务仍然是开放的,可能有一定的副作用,如:

  • 其他看到看到部分地改变的数据(依赖于隔离级别)
  • 行/表被锁定

事务一旦回滚,就好像它从未发生过一样。毕竟,这是使用交易的目的:-)。 如果您担心您的交易可能会滞留太久,您可能需要调整相关超时。

1

除了所有相关的其他回复之外,我想补充一点,如果在提交过程中您失去与数据库的连接,您将收到一个异常,它不会告诉您提交是否成功或不。要知道交易是否已经履行,您可以依靠Transaction Guard,这是12c中的一项新功能。

没有解释它是如何工作的一个博客: https://blogs.oracle.com/dev2dev/entry/write_recovery_code_with_transaction

您也可以参考数据库开发指南,其中有一个描述交易员的部分。