ホームページ > Java > &#&チュートリアル > Javaトランザクションとはどういう意味ですか?

Javaトランザクションとはどういう意味ですか?

(*-*)浩
リリース: 2019-05-21 17:27:52
オリジナル
2773 人が閲覧しました

トランザクションとはデータベースにアクセスするための一連の操作であり、データベースアプリケーションシステムはトランザクションセットを通じてデータベースへのアクセスを完了します。トランザクションが正しく実行されると、データベースはある状態から別の状態に遷移します。

Javaトランザクションとはどういう意味ですか?

1. 取引は ISO/IEC によって確立された ACID 原則に準拠する必要があります。

ACID は、Atomicity、Consistency、Isolation、Durability の略称で、トランザクションは 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 番目のタイプの更新同時実行性の喪失の問題が発生します。 , アプリケーションに適用できる 悲観的ロックまたは楽観的ロックは、このような問題を回避するためにプログラムで使用されます。アプリケーションの観点から見ると、ロックは次のカテゴリに分類できます:

Serializable: トランザクションは、実行中に他のトランザクションによってデータベースに加えられた更新を確認できません。反復読み取り: 実行中、トランザクションは他のトランザクションによって送信された新しく挿入されたレコードを確認できますが、他のトランザクションによる既存のレコードの更新を見ることはできません。 Read Committed (コミットされたデータの読み取り): トランザクションの実行中に、他のトランザクションによってコミットされた新しく挿入されたレコードを確認できます。また、他のトランザクションによってコミットされた既存のレコードの更新も確認できます。 uncommitted data) ): 実行中、トランザクションは、他のトランザクションによってコミットされていない新しく挿入されたレコードをコピーしたり、他のトランザクションによってコミットされていない既存のレコードの更新を確認したりできます。

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

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

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

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

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

#A. アプリケーションプログラム内で表示し、データベースシステムの排他使用を指定してデータリソースをロックします。 SQL ステートメント: 更新には select ...、Hibernate で get を使用、session.get(Account.class,new Long(1),LockMode,UPGRADE) などのロード


B. データベース テーブル A を追加します。レコードのステータスを示す LOCK フィールド。値が "Y" の場合、レコードがトランザクションによってロックされていることを意味します。 "N" の場合、レコードがアイドル状態にあり、トランザクションからアクセスできることを意味します。 。これは、ロック タグ フィールドを追加することで実現できます。

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

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

Hibernate が提供するバージョン管理機能を使用して、アプリケーションにオプティミスティック ロックを実装できます。OR マッピング ファイルの 要素と の両方にバージョン管理機能があります。通常はこれをお勧めします。 <バージョン>

を使用します

以上がJavaトランザクションとはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート