Java の基本トランザクションの詳細な紹介

黄舟
リリース: 2017-03-16 10:22:30
オリジナル
1061 人が閲覧しました

この記事では主にJavaの基本トランザクションの詳細な紹介に関する関連情報を紹介しますので、必要な方は参考にしてください

Javaトランザクションの詳しい説明

1.トランザクションとは

トランザクションはシーケンスです。データベース アプリケーション システムは、トランザクション セットを通じてデータベースへのアクセスを完了します。トランザクションが正しく実行されると、データベースは 1 つの 状態 から別の
状態

に遷移します。

取引は ISO/IEC によって確立された ACID 原則に準拠する必要があります。 ACID は、原子性、一貫性、分離性、耐久性の略語で、トランザクションは ISO/IEC によって確立された ACID 原則に準拠する必要があります。 ACID は、原子性、一貫性、分離性、耐久性の略語です。 アトミック。 つまり、不可分性、すべてのトランザクションが実行されるか、何も実行されないかのどちらかです。トランザクションのすべてのサブトランザクションが正常に送信された場合、すべての
データベース操作

が送信され、データベースの状態が変換されます。いずれかのサブトランザクションが失敗した場合、他のサブトランザクションのデータベース操作、つまりデータベースがロールバックされます。トランザクションが実行される前の状態に戻りますが、状態遷移は発生しません。


一貫性または文字列可能性。
トランザクションの実行により、データベースはある正しい状態から別の正しい状態に変換されます。

孤立。トランザクションが正しくコミットされるまでは、トランザクションによるデータへの変更を他のトランザクションに提供することはできません。つまり、トランザクションが正しくコミットされるまでは、その可能な結果が他のトランザクションに表示されるべきではありません。


粘り強さ。

トランザクションが正しく送信されると、トランザクションの送信後に他のエラーが発生した場合でも、トランザクションの処理結果はデー​​タベースに永続的に保存されます。

埋め込み SQL アプリケーションまたはスクリプトを実行すると、実行可能な SQL ステートメントが初めて実行されるとき (データベースへの接続が確立された後、または既存のトランザクションが終了した後)、トランザクションが自動的に開始されます。トランザクションを開始した後は、自動コミットと呼ばれるプロセスが使用されない限り、トランザクションを開始したユーザーまたはアプリケーションによって明示的に終了する必要があります (この場合、発行された個々の SQL ステートメントが表示されます。単一のトランザクションの実行は、トランザクションが完了するとすぐに暗黙的にコミットされます)実行されます)。

ほとんどの場合、トランザクションはCOMMIT文またはROLLBACK文を実行することで終了します。 COMMIT ステートメントが実行されると、トランザクションの開始以降にデータベースに加えられたすべての変更が永続的になります。つまり、変更はディスクに書き込まれます。 ROLLBACK ステートメントが実行されると、トランザクションの開始以降にデータベースに加えられたすべての変更が元に戻され、データベースはトランザクションが開始される前の状態に戻ります。どちらの場合でも、トランザクションが完了すると、データベースは一貫した状態に戻ることが保証されます。

トランザクションは、トランザクションが正常にコミットされた後にのみデータへの変更が永続的になることを保証することで、一般的なデータベースの一貫性を提供しますが、ユーザーまたはアプリケーションは、各トランザクションが実行された一連の SQL 操作が常に結果をもたらすことを保証する必要があることに注意することが重要です。一貫したデータベース内にあります。 2. データベース システムは 2 つの トランザクション モード

をサポートします。



自動コミット モード: 各 SQL ステートメントは独立したトランザクションであり、データベース システムは SQL ステートメントの実行を完了すると、トランザクションを自動的にコミットします。

手動コミット モード: トランザクションの開始境界と終了境界は、データベース クライアント プログラムによって明示的に指定する必要があります。

注:

MySQL

のデータベース テーブルは、INNODB、BDB、MyISAM の 3 つのタイプに分けられますが、このうち MyISAM はデータベース トランザクションをサポートしていません。 MySQL の create table ステートメントは、デフォルトで MyISAM タイプになります。

    3. 複数のトランザクションが同時に実行されている場合、これらのトランザクションがデータベース内の同じデータにアクセスする場合、必要な分離メカニズムが採用されていない場合、これらの同時実行性の問題は次のカテゴリに要約されます。
  • 最初のタイプの損失

    更新
  • : トランザクションが取り消されると、他のトランザクションによって送信された更新データは上書きされます。
  • ダーティリード: 1 つのトランザクションが、別のトランザクションによって送信された更新されたデータを読み取ります。
  • ダミー読み取り: あるトランザクションは、別のトランザクションによって送信された新しく挿入されたデータを読み取ります。
  • 非反復読み取り: 1 つのトランザクションは、別のトランザクションによって送信された更新されたデータを読み取ります。

  • 2 番目のタイプの更新の喪失: これは非反復読み取りの特殊なケースであり、あるトランザクションが別のトランザクションによって送信された更新データを上書きします。

4. 分離レベル

🎜 データベース システムが読み取りコミット分離レベルを採用すると、反復不可能な読み取りと 2 番目のタイプの更新同時実行性の喪失の問題が発生します。悲観的ロックまたは楽観的ロックを使用できます。アプリケーションでそのような問題を回避してください。アプリケーションの観点から見ると、ロックは次のカテゴリに分類できます: 🎜
  1. シリアル化可能: トランザクションは、実行中に他のトランザクションによってデータベースに加えられた更新を確認できません。

  2. Repeatable Read: トランザクションの実行中、他のトランザクションによって送信された新しく挿入されたレコードを確認できますが、他のトランザクションによる既存のレコードの更新は確認できません。

  3. Read Committed (コミットされたデータの読み取り): トランザクションの実行中に、他のトランザクションによってコミットされた新しく挿入されたレコードを確認できます。また、他のトランザクションによってコミットされた既存のレコードの更新も確認できます

  4. Read Uncommitted (コミットされていないデータの読み取り): 実行中に、トランザクションは、他のトランザクションによってコミットされていない新しく挿入されたレコードをコピーしたり、他のトランザクションによってコミットされていない既存のレコードの更新を確認したりできます。

分離レベルが高くなるほど、データの完全性と一貫性が保証されますが、同時実行パフォーマンスへの影響は大きくなります。ほとんどのアプリケーションでは、データベース システムの分離レベルを Read Commited に設定することを優先できます。これにより、ダーティ リードが回避され、同時実行パフォーマンスが向上します。これにより、反復不可能な読み取り、仮想読み取り、第 2 タイプの更新の喪失などの同時実行性の問題が発生しますが、そのような問題が発生する可能性がある個々の状況では、アプリケーションが悲観的ロックまたは楽観的ロックを使用して制御できます。

データベース システムが読み取りコミット分離レベルを採用すると、反復不可能な読み取りと 2 番目のタイプの更新の損失という同時実行の問題が発生します。このような問題を回避するには、アプリケーションで悲観的ロックまたは楽観的ロックを使用できます。アプリケーションの観点から、ロックは次のカテゴリに分類できます:

A. 悲観的ロック: は、アプリケーションに表示されるデータ リソースのロックを指します。これにより、更新の損失や反復不可能な読み取りなどの同時実行の問題は防止されますが、同時実行のパフォーマンスに影響するため、使用には注意が必要です。

B. 楽観的ロック: 楽観的ロックは、現在の トランザクションがデータ リソースを操作するとき、同時に他のトランザクションがデータ リソースにアクセスしないことを前提としているため、データベースの分離レベルに完全に依存して自動的に管理されます。ロックの仕事。アプリケーションはバージョン管理を使用して、同時実行の問題の可能性を回避します。

5. 悲観的ロックを実装するには 2 つの方法があります。

A. アプリケーションプログラムでデータベースシステムの排他使用を指定し、データリソースをロックします。 SQL ステートメント: select...

for

update、読み込み時に休止状態で get を使用します (例: session.get(Account.class,new Long(1),LockMode,UPGRADE)) B. レコードのステータスを示す LOCK フィールドを追加します。その値が "Y" の場合は、レコードがトランザクションによってロックされていることを意味します。アイドル状態にあり、トランザクションはそれにアクセスできます。これは、ロック タグ フィールドを追加することで実現できます。

Hibernate バージョン管理を利用してオプティミスティック ロックを実装する

オプティミスティック ロックは、プログラムによって提供されるメカニズムです。このメカニズムは、複数のトランザクションがデータに同時にアクセスすることを保証するだけでなく、2 番目のタイプの更新喪失の問題も防ぐことができます。

Hibernate が提供するバージョン管理機能を使用して、アプリケーションにオプティミスティック ロックを実装することができます。一般的に、OR マッピング ファイルの 要素と time

stamp> の両方にバージョン管理機能があることが推奨されます。 <バージョン>を使用してください

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!