默认情况下,事务中创建的结果集将在事务提交到数据库后保持打开状态,或在回滚时保持打开状态。但是,在事务提交后,使结果集关闭有时也会很有用。为此,Microsoft SQL Server JDBC Driver 支持使用结果集的保持能力。
可通过使用 SQLServerConnection 类的 setHoldability 方法设置结果集的保持能力。使用 setHoldability 方法设置保持能力时,可使用 ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 的结果集保持能力的常量。
创建语句对象之一时,JDBC Driver 也支持设置保持能力。创建语句对象时,如果该对象包含带有结果集保持能力参数的重载,则语句对象的保持能力必须与连接的保持能力匹配。如果不匹配,将引发异常。这是因为 SQL Server 仅在连接级别支持保持能力。
结果集的保持能力是在仅为服务器端游标创建结果集时,与结果集相关联的 SQLServerConnection 对象的保持能力。它不适用于客户端游标。所有具有客户端游标的结果集将始终具有值为 ResultSet.HOLD_CURSORS_OVER_COMMIT 的保持能力。
对于服务器游标,当连接到 SQL Server 2005 或更高版本时,设置保持能力只会影响该连接上将要创建的新结果集的保持能力。这意味着,设置保持能力对该连接上以前创建的和已打开的所有结果集的保持能力没有影响。但是,如果使用 SQL Server 2000,设置保持能力会影响该连接上现有的结果集和将要创建的新结果集的保持能力。
在下面的示例中,结果集的保持能力将在执行 try
块中包含两个单独语句的本地事务时进行设置。这些语句将对 SQL Server 2005 AdventureWorks 示例数据库中的 Production.ScrapReason 表运行。首先,示例通过将自动提交设置为 false 来切换到手动事务模式。禁用自动提交模式后,在应用程序显式调用 commit 方法之前,不会提交任何 SQL 语句。如果引发异常,catch 块中的代码将回滚此事务。
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 { System.out.println("Transaction failed."); con.rollback(); } catch (SQLException se) { se.printStackTrace(); } } } }