トランザクションについて

JDBC ドライバーのダウンロード

トランザクションは、一連の操作を結合した論理的な作業単位です。 トランザクションを使用すると、エラーが発生した場合でも、トランザクションの各操作の一貫性と整合性を制御および維持できます。

Microsoft JDBC Driver for SQL Server を使用すると、トランザクションをローカルにすることも、分散することもできます。 トランザクションで分離レベルを使用することもできます。 JDBC ドライバーでサポートされる分離レベルの詳細については、「分離レベルについて」を参照してください。

アプリケーションからトランザクションを制御する際には、Transact-SQL ステートメントか、JDBC ドライバーに備わっているメソッドのどちらかを使用します。両方を使用することはできません。 同じトランザクションで Transact-SQL ステートメントと JDBC API メソッドの両方を使用した場合、トランザクションを適切なタイミングでコミットできない、突然トランザクションがコミットまたはロールバックされて新しいトランザクションが開始される、"トランザクションを再開できませんでした" という例外が発生するなどの問題が生じる可能性があります。

ローカル トランザクションの使用

単一フェーズであり、データベースによって直接処理されるトランザクションは、ローカル トランザクションであると見なされます。 JDBC ドライバーは、SQLServerConnection クラスのさまざまなメソッド (setAutoCommitcommitrollback など) を使用して、ローカル トランザクションをサポートします。 通常、ローカル トランザクションはアプリケーションによって明示的に管理されるか、Java Platform, Enterprise Edition (Java EE) アプリケーション サーバーによって自動的に管理されます。

次の例では、try ブロック内の 2 つの個別のステートメントで構成されるローカル トランザクションを実行しています。 ステートメントは、AdventureWorks2022 サンプル データベースの Production.ScrapReason テーブルに対して実行され、例外がスローされない場合はコミットされます。 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 2.0 オプション API 仕様で JDBC API に追加されました。 分散トランザクションの管理は、通常、Java EE アプリケーション サーバー環境内で Java Transaction Service (JTS) トランザクション マネージャーによって自動的に実行されます。 ただし、Microsoft JDBC Driver for SQL Server は、すべての Java Transaction API (JTA) 準拠のトランザクション マネージャーで分散トランザクションをサポートします。

JDBC ドライバーは、Microsoft 分散トランザクション コーディネーター (MS DTC) とシームレスに統合して、SQL Server による真の分散トランザクション サポートを提供します。 MS DTC は、Microsoft によって Microsoft Windows システム用に提供される分散トランザクション機能です。 MS DTC は、Microsoft の実証済みのトランザクション処理技術を使用して、完全な 2 フェーズ分散コミット プロトコルや分散トランザクションの回復などの XA 機能をサポートします。

分散トランザクション使用方法の詳細については、「XA トランザクションについて」を参照してください。

関連項目

JDBC ドライバーを使用したトランザクションの実行