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)
.
*:这实际上是一个实现细节,对于某些数据库,自动提交模式可能完全在服务器端处理
迭代结果集时是否需要启动并提交事务?
喜欢以下内容:
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)
.
*:这实际上是一个实现细节,对于某些数据库,自动提交模式可能完全在服务器端处理