我连接到Oracle Java程序,并执行以下操作发生在我的JDBC事务是什么:如果我失去了我的会议
启动会议
开始交易
插入一堆行,调用存储过程等。
提交事务
结束会话
左右。 。 。如果在交易过程中我失去了会话(由于网络问题或某种程度的原因)会发生什么?我是否会自动回滚?交易超时后我会回滚吗?我担心我的数据库将处于不一致的状态,直到甲骨文开始清理。
我连接到Oracle Java程序,并执行以下操作发生在我的JDBC事务是什么:如果我失去了我的会议
启动会议
开始交易
插入一堆行,调用存储过程等。
提交事务
结束会话
左右。 。 。如果在交易过程中我失去了会话(由于网络问题或某种程度的原因)会发生什么?我是否会自动回滚?交易超时后我会回滚吗?我担心我的数据库将处于不一致的状态,直到甲骨文开始清理。
如果在执行事务期间会话丢失,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
关于自动提交的好处。请注意,如果您使用实现JPA(Java持久性API)的ORM(例如Hibernate或EclipseLink),则自动提交将自动关闭,并覆盖由JDBC设置的默认值。 – sleske
如果我失去了我的会话(由于网络问题或 有点)在交易的中间发生了什么?
究竟发生了什么取决于您使用的数据库系统(DBMS)及其配置。但大多数DBMS,特别是Oracle,都配置了超时(或多个超时)。如果超时过期,事务将被回滚。
尤其是Oracle,DBA可以列出Oracle服务器上的打开会话,甚至可以在超时过期之前强制终止会话。结果将是相同的:被终止的会话内的任何挂起的事务将被回滚。
我担心我的数据库将处于不一致的状态,直到甲骨文得到清理。
这取决于您所指的“不一致状态”以及您所使用的事务隔离级别。只要事务仍然是开放的,可能有一定的副作用,如:
事务一旦回滚,就好像它从未发生过一样。毕竟,这是使用交易的目的:-)。 如果您担心您的交易可能会滞留太久,您可能需要调整相关超时。
除了所有相关的其他回复之外,我想补充一点,如果在提交过程中您失去与数据库的连接,您将收到一个异常,它不会告诉您提交是否成功或不。要知道交易是否已经履行,您可以依靠Transaction Guard,这是12c中的一项新功能。
没有解释它是如何工作的一个博客: https://blogs.oracle.com/dev2dev/entry/write_recovery_code_with_transaction
您也可以参考数据库开发指南,其中有一个描述交易员的部分。
我很担心行被锁定的交易,并没有被释放,直到甲骨文注意到我的会议不见了,继续前进并为我回滚。注意我很不确定,这就是为什么我问。 。 。 – akaioi
http://stackoverflow.com/questions/5932437/oracle-user-disconnected-without-committing-rolling-back-not-longer-can-change – OldProgrammer
相关:[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