我正在从 Java 程序连接到 Oracle,并执行以下操作:
开始 session
开始交易
插入一堆行、调用存储过程等
提交事务
结束 session
所以。 。 。如果我在交易过程中丢失 session (由于网络问题或其他原因)会发生什么?我会自动回滚吗?当事务超时时我会回滚吗?我担心我的数据库将处于不一致的状态,直到 Oracle 开始清理。
最佳答案
如果您的 session 在事务执行期间丢失,Oracle 数据库将自动回滚您的更改。您可以阅读更多关于 Statement level atomicity在文档中。如果由于网络问题而丢失事务,您通常会收到ORA-03113:通信 channel 上的文件结束
,并且您的事务已在数据库上回滚。
但是,只有当您的 session 在数据库服务器本身丢失时才会出现这种情况。特别是对于分布式事务 (XA),您的数据库事务通常在 JDBC session 消失时保持 Activity 状态,因此当您有 XA 事务时请注意这一点。
还要注意 JDBC 驱动程序中默认打开的自动提交。这会自动提交您执行的每个操作,因此如果您有一个较长的事务(例如 10 次插入)并且您的第 9 次插入失败,则插入 1 - 8 已自动提交并且不会再回滚。可以通过 Connection.setAutoCommit(false);
关闭自动提交,请参阅 setAutoCommit in the JDBC API documentation
关于java - 如果我丢失 session ,我的 JDBC 事务会发生什么情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608378/