默认情况下,事务中创建的结果集将在事务提交到数据库后关闭,或在回滚时关闭。但是,即便在事务提交后,使结果集处于打开状态有时也会很有用。为此,Microsoft SQL Server 2005 JDBC Driver 支持使用结果集的保持能力。
可通过使用 SQLServerConnection 类的 setHoldability 方法设置结果集的保持能力。使用 setHoldability 方法设置保持能力时,可使用结果集保持能力的常量 HOLD_CURSORS_OVER_COMMIT 或 CLOSE_CURSORS_AT_COMMIT。
注意:
创建 Statement 对象之一时,JDBC 驱动程序不支持设置保持能力。包含带有结果集保持能力参数的重载的语句对象会在调用时引发异常。
结果集的保持能力是在仅为服务器端游标创建结果集时,与结果集相关联的 SQLServerConnection 对象的保持能力。它不适用于客户端游标。
在下面的实例中,结果集的保持能力将在执行 try 块中包含两个单独语句的本地事务时进行设置。该语句将根据 SQL Server 2005 AdventureWorks 示例数据库中的表 Production.ScrapReason 来运行,并使用保存点回滚第二个语句。这会导致只有第一个语句提交给数据库。
public static void executeTransaction(Connection con) {
try {
con.setAutoCommit(false);
con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Bad part')");
ResultSet rs = stmt.executeQuery("SELECT * FROM Production.ScrapReason");
con.commit();
System.out.println("Transaction succeeded.");
//Display results.
while (rs.next()) {
System.out.println(rs.getString(2));
}
stmt.close();
}
catch (SQLException ex) {
ex.printStackTrace();
try {
con.rollback();
System.out.println("Transaction failed.");
}
catch (SQLException se) {
se.printStackTrace();
}
}