ホームページ  >  記事  >  Java  >  Java でのトランザクション用の Spring トランザクション (JDBC)

Java でのトランザクション用の Spring トランザクション (JDBC)

巴扎黑
巴扎黑オリジナル
2017-06-26 11:26:181432ブラウズ

トランザクションの特徴:

1) アトミック性: トランザクションはデータベースの論理的な作業単位であり、データ変更の場合、すべてが実行されるか、まったく実行されないかのどちらかでなければなりません。 。

2) 一貫性: トランザクションが完了すると、すべてのデータが一貫している必要があります。関連するデータベースでは、すべてのデータの整合性を維持するために、トランザクションの変更にすべてのルールを適用する必要があります。

3) 分離: トランザクションの実行は他のトランザクションの影響を受けることができません。

4) 耐久性: トランザクションが送信されると、トランザクションの操作は DB に永続的に保存されます。この時点でロールバック操作を実行しても、変更は元に戻されません。

トランザクション: 同時実行制御の単位であり、ユーザー定義の操作シーケンスです。これらの操作はすべて実行されるか、まったく実行されないかのいずれかであり、これらは統合された作業単位です。 SQL Server はトランザクションを通じて、論理的に関連する一連の操作をバインドして、サーバーがデータの整合性を維持できるようにします。トランザクションは通常、トランザクションの開始で始まり、コミットまたはロールバックで終了します。コミットとは、送信、つまりトランザクションをコミットするすべての操作を意味します。具体的には、トランザクション内のデータに対するすべての更新はディスク上の物理データベースに書き戻され、トランザクションは正常に終了します。ロールバックとは、ロールバックを意味します。つまり、トランザクションの実行中に何らかの障害が発生し、システムはトランザクション内のデータベースに対する完了した操作をすべて取り消し、トランザクションが開始された状態にロールバックします。

トランザクションの自動コミット: 個々のステートメントがトランザクションです。各ステートメントの後には暗黙的なコミットがあります。 (デフォルト)

明示的なトランザクション: トランザクションの開始表示で始まり、コミットまたはロールバックで終了します。

暗黙的トランザクション: 接続が暗黙的トランザクション モードで動作する場合、SQL Server データベース エンジン インスタンスは、現在のトランザクションをコミットまたはロールバックした後、新しいトランザクションを自動的に開始します。物事の始まりを説明する必要はなく、各トランザクションをコミットまたはロールバックするだけです。ただし、各トランザクションはコミットまたはロールバックによって明示的に終了します。接続によって暗黙的トランザクション モードがオープンに設定されると、データベース エンジン インスタンスが次のステートメントのいずれかを初めて実行するときに暗黙的トランザクションが自動的に開始されます: alter table、insert、create、open、delete、revoke、drop、select 、フェッチ、テーブルの切り捨て、付与、更新トランザクションは、コミットまたはロールバック ステートメントが発行されるまで有効なままになります。最初のトランザクションがコミットまたはロールバックされた後、次回接続で上記のステートメントのいずれかが実行されると、データベース エンジン インスタンスは新しいトランザクションを自動的に開始します。このインスタンスは、暗黙的トランザクション モードがオフになるまで、暗黙的トランザクション チェーンを生成し続けます。

Java JDBC トランザクション メカニズム

まず、既存の JDBC 操作がどのような大きな問題を引き起こすかを見てみましょう。たとえば、ある情報を変更してその情報をクエリする場合、次のようなビジネスがあります。シンプルなビジネスは実装が非常に簡単ですが、このビジネスをマルチスレッドの同時実行性の高いプラットフォームに配置すると、たとえば、変更を実行した後、クエリの実行前にスレッドも実行されるなど、当然問題が発生します。ステートメントを変更します。クエリを再度実行すると、表示される情報が変更した内容と異なる場合があります。実際、コードの実装は非常に簡単です。参考までに:

private Connection conn = null;  
private PreparedStatement ps = null;  
 
try {  
    conn.setAutoCommit(false);  //将自动提交设置为false  
              
    ps.executeUpdate("修改SQL"); //执行修改操作  
    ps.executeQuery("查询SQL");  //执行查询操作                 
    conn.commit();      //当两个操作成功后手动提交  
              
} catch (Exception e) {  
    conn.rollback();    //一旦其中一个操作出错都将回滚,使两个操作都不成功  
    e.printStackTrace();  
}

トランザクションに関する理論
1. トランザクションの 4 つの属性 (ACID)
データに対するアトミックな変更はすべて実行されるか、まったく実行されません。
Consistent (一貫性) トランザクション実行前後でデータの状態が一貫しています。
分離 あるトランザクションの処理が別のトランザクションの処理に影響を与えることはできません。
永続トランザクション処理が終了し、その効果がデータベースに永続化されます。

2. 同時トランザクション処理によって発生する可能性のある問題
ダーティリード (ダーティリード): 1 つのトランザクションが別のトランザクションによってまだ送信されていないデータを読み取る、
非反復可能リード (non-repeatable read): 1 つのトランザクションの操作前後に別のトランザクションが発生する 異なるデータが2回読み込まれる
ファントムリード(ファントムリード) 1つのトランザクションの操作により、別のトランザクションの前後で2つのクエリの結果のデータ量が異なります。
例:
トランザクションAとBが同時に実行された場合、
トランザクションAが更新された後、トランザクションBはAのコミットされていないデータを読み込むことを選択します。 このとき、トランザクションAはロールバックし、Bが読み込んだデータは無効な「ダーティ」になります。データ。 。
B トランザクションがデータの読み取りを選択した後、A トランザクションの更新操作により、B トランザクションで選択されたデータが変更されます。このとき、B トランザクションは再度データを読み取り、2 つのデータが異なることがわかります。
トランザクション B がデータの読み取りを選択した後、トランザクション A はトランザクション A の選択条件を満たすレコードを挿入または削除します。このとき、トランザクション B は再度選択し、前回存在しなかったレコード (「ファントム」) を発見します。がクエリされたか、前のレコードがクエリされました。時刻のレコードがありません。

JDBC のトランザクション サポート
JDBC のトランザクション サポートは、次の 3 つの側面に反映されています。
1. 自動コミット モード (自動コミット モード)
接続は、トランザクションの終了時期を指定する自動コミット属性を提供します。
a. 自動コミットが true の場合、各独立した SQL 操作の実行が完了すると、トランザクションはすぐに自動的に送信されます。これは、各 SQL 操作がトランザクションであることを意味します。
独立した SQL 操作が完了すると、JDBC 仕様では次のように規定されています。
データ操作言語 (挿入、更新、削除などの DML) およびデータ定義言語 (作成、削除など) の場合、ステートメントはすぐに完了したとみなされます。実行されると実行を完了します。
select ステートメントの場合、それに関連付けられた ResultSet オブジェクトが閉じられたときに実行が完了したとみなされます。
複数の結果を返すストアド プロシージャまたはその他のステートメントの場合、それに関連付けられているすべての ResultSet オブジェクトが閉じられると、すべての更新カウント (更新、削除、その他のステートメント操作によって影響を受ける行の数) と出力パラメーター (ストアド プロシージャの出力パラメーター) ) will 取得後、実行が完了したものとみなされます。
b. auto-commit が false の場合、各トランザクションは commit メソッドを明示的に呼び出してコミットするか、rollback メソッドを明示的に呼び出してロールバックする必要があります。自動コミットのデフォルトは true です。
JDBC は、Connection で定義される 5 つの異なるトランザクション分離レベルを提供します。

2. トランザクション分離レベル
JDBC は、次の 5 つのトランザクション分離レベルを定義します。
TRANSACTION_NONE JDBC ドライバーはトランザクションをサポートしません
TRANSACTION_READ_UNCOMMITTED は、ダーティ リード、非反復読み取り、ファントム リードを許可します。
TRANSACTION_READ_COMMITTED はダーティ読み取りを禁止しますが、反復不可能な読み取りとファントム読み取りは許可します。
TRANSACTION_REPEATABLE_READ はダーティ リードと非反復読み取りを禁止し、ファントム リードのみを実行します。
TRANSACTION_SERIALIZABLE は、ダーティ リード、非反復読み取り、ファントム リードを禁止します。

3. SavePoint (SavePoint)
JDBC は、よりきめ細かいトランザクション制御メカニズムを提供する SavePoint インターフェイスを定義します。セーブポイントが設定されている場合、トランザクション全体をロールバックする代わりに、セーブポイントの状態にロールバックできます。
Connection インターフェースの setSavepoint メソッドと releaseSavepoint メソッドは、セーブポイントを設定および解放できます。

JDBC 仕様ではトランザクションに対する上記のサポート動作が定義されていますが、各 JDBC ドライバーやデータベースの製造元によるトランザクションのサポートの程度は異なる場合があります。プログラム内で任意に設定すると、期待した効果が得られない場合があります。この目的のために、JDBC は DatabaseMetaData インターフェイスを提供します。これは、JDBC 機能サポートを取得するための一連のメソッドを提供します。たとえば、トランザクション分離レベルのサポートは DatabaseMetaData.supportsTransactionIsolationLevel メソッドを通じて決定でき、セーブポイントのサポートは DatabaseMetaData.supportsSavepoints メソッドを通じて決定できます。


以上がJava でのトランザクション用の Spring トランザクション (JDBC)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。