Como usar a suspensão
Por padrão, um conjunto de resultados criado dentro de uma transação é mantido em aberto depois que a transação é confirmada no banco de dados, ou quando é revertida. Porém, às vezes é útil que o conjunto de resultados seja fechado, depois que a transação foi confirmada. Para fazer isso, o Microsoft JDBC Driver para SQL Server dá suporte ao uso de suspensão de conjuntos de resultados.
A colocação em espera de conjuntos de resultados pode ser configurada usando o método setHoldability da classe SQLServerConnection. Ao definir a colocação em espera usando o método setHoldability, podem ser usadas as constantes de colocação em espera do conjunto de resultados de ResultSet.HOLD_CURSORS_OVER_COMMIT
ou ResultSet.CLOSE_CURSORS_AT_COMMIT
.
O driver JDBC também oferece suporte à colocação em espera ao criar um dos objetos de instrução. Ao criar os objetos de Instrução que têm sobrecargas com parâmetros de colocação em espera do conjunto de resultados, o objeto de instrução de colocação em espera deverá corresponder à colocação em espera da conexão. Quando eles não corresponderem, uma exceção será lançada. Isto acontece porque o SQL Server só oferece suporte à colocação em espera no nível de conexão.
A colocação em espera de um conjunto de resultados é a colocação em espera do objeto SQLServerConnection que está associado ao conjunto de resultados apenas no momento em que ele é criado para cursores do lado de servidor. Isso não se aplica a cursores do lado do cliente. Todos os conjuntos de resultados com cursores do lado do cliente sempre terão o valor de suspensão de ResultSet.HOLD_CURSORS_OVER_COMMIT
.
Nos cursores de servidor, quando conectados ao SQL Server 2005 ou posterior, a definição da suspensão afetará apenas a suspensão dos novos conjuntos de resultados que ainda serão criados nessa conexão. Isto significa que configurar a colocação em espera não tem nenhum impacto na colocação em espera de nenhum conjunto de resultados que foi criado e que já está aberto previamente naquela conexão.
No exemplo a seguir, a colocação em espera de um conjunto de resultados é definida durante a execução de uma transação local que consiste em duas instruções separadas no bloco try
. As instruções são executadas em relação à tabela Production.ScrapReason no banco de dados de exemplo AdventureWorks2022. Primeiro, o exemplo alterna para o modo de transação manual definindo a confirmação automática como false
. Quando o modo de confirmação automática é desabilitado, nenhuma instrução SQL será confirmada até que o aplicativo chame o método commit explicitamente. O código no bloco catch reverterá a transação se uma exceção for lançada.
public static void executeTransaction(Connection con) {
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
con.setAutoCommit(false);
con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
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));
}
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}