Поделиться через


Использование возможности ожидания

Скачать драйвер JDBC

По умолчанию результирующий набор, созданный внутри транзакции, сохраняется открытым после фиксации транзакции в базе данных или ее отката. Однако иногда полезно закрыть результирующий набор после фиксации транзакции. Для этого драйвер Microsoft JDBC Driver for SQL Server поддерживает удержание результирующего набора.

Возможность ожидания результирующего набора задается при помощи метода setHoldability класса SQLServerConnection. При настройке возможности ожидания с помощью метода setHoldability можно использовать константы возможности ожидания результирующего набора ResultSet.HOLD_CURSORS_OVER_COMMIT или ResultSet.CLOSE_CURSORS_AT_COMMIT.

Драйвер JDBC также поддерживает удержание при создании одного из объектов инструкции. При создании объектов инструкции, имеющих перегрузку параметров удержания результирующего набора, удержание объекта инструкции должно соответствовать удержанию подключения. Если они не соответствуют друг другу, возникает исключение. Это происходит, так как SQL Server поддерживает возможность ожидания только на уровне подключения.

Возможность ожидания результирующего набора соответствует возможности ожидания объекта SQLServerConnection, связанного с результирующим набором, в момент создания результирующего набора только для курсоров на стороне сервера. Это не применяется к курсорам на стороне клиента. Все результирующие наборы с курсорами на стороне клиента всегда имеют значение возможности ожидания ResultSet.HOLD_CURSORS_OVER_COMMIT.

Для серверных курсоров при соединении с SQL Server 2005 или более поздней версии параметр возможности сохранения влияет только на новые результирующие наборы, которые будут созданы для этого соединения. Это означает, что настройка возможности ожидания не влияет на результирующие наборы, которые были созданы ранее и открыты в настоящий момент для этого подключения.

В следующем примере возможность ожидания результирующего набора задается при выполнении локальной транзакции, состоящей из двух отдельных инструкций в блоке try. Инструкции выполняются в таблице Production.ScrapReason в примере базы данных AdventureWorks2022. Сначала происходит переключение в режим выполнения транзакций вручную путем установки для автоматической фиксации значения false. После отключения режима автоматической фиксации инструкции SQL не будут фиксироваться, пока приложение не вызовет явным образом метод commit. Код в блоке catch откатит транзакцию, если возникнет исключение.

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();
        }
    }
}

См. также

Выполнение транзакций с помощью JDBC Driver