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


Основные сведения о транзакциях

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

Транзакции — это группы операций, объединенные в логические рабочие модули. Их используют для управления согласованностью и целостностью каждого действия в транзакции и технической поддержки во избежание возможных ошибок в системе.

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

Транзакции должны управляться приложениями посредством или инструкций Transact-SQL, или методов, предоставляемых драйвером JDBC, но не тем и другим одновременно. Одновременное использование инструкций Transact-SQL и методов JDBC API для одной и той же транзакции может привести к неполадкам, например к невозможности зафиксировать транзакцию в ожидаемое время: фиксация или откат транзакции и начало новой произойдет в неожиданный момент, возникнут исключения "Не удалось возобновить транзакцию".

Использование локальных транзакций

Транзакция считается локальной, если она является однофазной и управляется базой данных напрямую. Драйвер JDBC поддерживает локальные транзакции с помощью различных методов класса SQLServerConnection, включая setAutoCommit, commit и rollback. Локальные транзакции обычно явно управляются приложением или автоматически управляются сервером приложений Java Enterprise Edition (Java EE).

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

public static void executeTransaction(Connection con) {
    try {
        //Switch to manual transaction mode by setting
        //autocommit to false. Note that this starts the first 
        //manual transaction.
        con.setAutoCommit(false);
        Statement stmt = con.createStatement();
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')");
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')");
        con.commit(); //This commits the transaction and starts a new one.
        stmt.close(); //This turns off the transaction.
        System.out.println("Transaction succeeded. Both records were written to the database.");
    }
    catch (SQLException ex) {
        ex.printStackTrace();
        try {
            System.out.println("Transaction failed.");
            con.rollback();
        }
        catch (SQLException se) {
            se.printStackTrace();
        }
    }
}

Использование распределенных транзакций

Распределенная транзакция обновляет данные в двух или более сетевых базах данных, при этом сохраняются свойства атомарности, согласованности, изолированности и устойчивости (ACID) обработки транзакций. Поддержка распределенных транзакций была добавлена в JDBC API в дополнительной спецификации API JDBC 2.0. Распределенные транзакции обычно автоматически управляются диспетчером транзакций Java Transaction Service (JTS) в среде сервера приложений Java EE. Тем не менее Microsoft JDBC Driver for SQL Server поддерживает распределенные транзакции с любым диспетчером транзакции, совместимым с интерфейсом JTA (Java Transaction API).

Драйвер JDBC без проблем интегрируется с MS DTC (координатор распределенных транзакций Microsoft), обеспечивая полноценную поддержку распределенных транзакций для SQL Server. MS DTC — это средство управления распределенными транзакциями, которое предоставляется корпорацией Майкрософт для систем Microsoft Windows. Благодаря применению проверенной технологии обработки транзакций корпорации Майкрософт, MS DTC поддерживает такие возможности XA, как полный двухфазный распределенный протокол фиксации и восстановление распределенных транзакций.

Дополнительные сведения об использовании распределенных транзакций см. в разделе Основные сведения о транзакциях XA.

См. также

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