JDBC 结果集事务

JDBC transaction for resultSet

迭代结果集时是否需要启动并提交事务?

喜欢以下内容:

String query = ....;
Connection con = ... // create the connection
con.setAutoCommit(false);
try (Statement stmt = con.createStatement()) {
  ResultSet rs = stmt.executeQuery(query);
  while (rs.next()) {
     //do things here
  }
} catch (SQLException e) {
  // roll back
}

我看到它在没有活动事务的情况下也能正常工作,但我不明白为什么。

如果启用了自动提交,那么当你执行一条语句时,驱动程序会为你启动(*)一个事务,并在执行完成后立即结束(对于查询,即当你处理完所有rows or closed the result set, or execution resulted an exception), or when you execute another statement.

当您禁用自动提交模式时,驱动程序将在需要时启动事务(例如,当您执行语句时),但需要通过调用 Connection.commit() 手动结束事务或 Connection.rollback() (或再次启用自动提交模式时)。当您没有明确结束事务时,它将保持活动状态,直到您关闭连接(此时大多数驱动程序将回滚,但有些 - 例如 Oracle - 将提交)。

简而言之,JDBC 不提供显式启动事务的方法,它会在必要时启动一个。在您的示例中,交易开始于 stmt.executeQuery(query).


*:这实际上是一个实现细节,对于某些数据库,自动提交模式可能完全在服务器端处理