ホームページ  >  記事  >  データベース  >  Spring トランザクションと宣言的トランザクションの使用を理解する方法

Spring トランザクションと宣言的トランザクションの使用を理解する方法

坏嘻嘻
坏嘻嘻オリジナル
2018-09-15 11:27:081903ブラウズ

この記事の内容は、データベース内のものの分離レベルを含む、Spring トランザクションと宣言型トランザクションの使用方法について説明しています。必要な方は参考にしていただければ幸いです。あなたのお役に立てますように。

#Spring トランザクションと宣言的トランザクションの使用

(学生の皆さん、大学から教師に与えられたデータベースの知識を復習し始めてください!!)

トランザクション: データベース内のさまざまなデータ項目にアクセスし、場合によっては更新するプログラム実行ユニット (ユニット)。

トランザクションには 4 つの属性があります: (ACID)

原子性: トランザクションは分割できない作業単位であり、トランザクションに含まれるすべての操作は完了するか、まったく行われないかのどちらかです。

整合性。トランザクションはデータベースをある整合性状態から別の整合性状態に変更する必要があります。一貫性と原子性は密接に関係しています。

分離: トランザクションの実行は他のものによって干渉されません。つまり、トランザクションで使用される内部操作とデータは他の同時トランザクションから分離されており、同時に実行されるトランザクションは相互に干渉できません。

永続性: 永続性は永続性とも呼ばれ、トランザクションが送信されると、データベース内のデータへの変更が永続的になることを意味します。

トランザクションの目的: データの一貫性と整合性を維持するため。

一貫性: ビジネス チェーンのデータ ステータスは一貫しており、部分的に変更したり部分的に変更したりすることはできません。

整合性: ビジネス チェーンのデータは完全であり、完了と失敗が同時に発生し、部分的な書き込みは成功せず、部分的な書き込みは失敗します。

トランザクションの一貫性と完全性を簡単に理解すると、私たちは一緒に生きるか一緒に死ぬかのどちらかであり、一人では生きていけないということになります。 (惨めな愛のように...^ _ ^)

データベースのトランザクション分離レベル

トランザクション分離レベルを理解する前に、まずデータでよく発生する考えられる原因を理解しましょう。いくつかの状況があります。ビジネス ロジックが失敗する場合。

ダーティ リーディング

トランザクションがデータにアクセスし、データを変更し、まだデータベースに送信していない場合、別のトランザクションもデータにアクセスし、このデータを使用します。 。

例: Zhang San の銀行口座には 1000 があり、Zhang San は 200 を入金し、Zhang San が送信をクリックすると、彼の妻 (働き者の Zhang San は妻のために小遣いを貯めています) が買い物をしています。ショッピングモールで500円を使います。張三が残高を確認すると、500しかなかった(張三は混乱していた…)。それから二人は200回以上喧嘩した。以上が、読書のしすぎによる家族戦争の原因でした。

反復不可能な読み取り

反復不可能な読み取り: トランザクション内で同じデータを複数回読み取ります。このトランザクションが終了する前に、別のトランザクションもデータにアクセスしました。最初のトランザクションによる 2 回のデータ読み取りの間で、最初のトランザクションで読み取られたデータは、2 番目のトランザクションによる変更により異なる場合があります。このように、トランザクション内で 2 回読み取られるデータは異なります。 (つまり、同じデータを読み取ることはできません)

ファントム読み取り

トランザクションはテーブル内のデータを変更します。この変更には、テーブル内のすべてのデータ行が同時に含まれます。 2 番目のトランザクションは、テーブルに新しいデータ行を挿入します。最初のトランザクションを操作するユーザーが、テーブル内にまだ変更されていないデータ行が存在することに気づくことがあります。まるで幻覚のようでした。

Spring の 5 つの分離レベル

ISOLATION_DEFAULT

は、基になるデータベースのデフォルトの分離レベルを表します。通常の値は ISOLATION _READ _COMMITTED

ISOLATION _READ _UNCOMMITTED

トランザクションは、別のトランザクションによって変更されたがまだコミットされていないデータを読み取ることができ、ダーティ リードと反復不可能な読み取りを防ぐことができないことを示します。

ISOLATION _READ _COMMITTED

トランザクションは、別のトランザクションによって送信されたデータのみを読み取ることができますが、ダーティ リードは防止できますが、反復不可能な読み取りは防止できません。 (ほとんどの場合の推奨値)

ISOLATION _REPEATABLE _READ

トランザクションはプロセス全体でクエリを複数回繰り返し実行でき、毎回返されるレコードは同じです。複数のクエリの間にクエリを満たすための新しいデータがある場合でも、これらの新しいレコードは無視されます。ダーティ リードと非反復読み取りを防止できます。

ISOLATION _SERIALIZBLE

すべてのトランザクションは 1 つずつ順番に実行されるため、トランザクション間で干渉が発生する可能性はありません。ダーティ リード、非反復読み取り、ファントム リードを防ぐことができます。

トランザクションの伝播 (Spring は 7 つを提供します)

トランザクション間の関係を指します。たとえば、トランザクションに別のトランザクションが含まれている場合、相互の実行を決定するために伝播が使用されます。

TransationDefinition.PROPAGETION.REQUIRED

トランザクションが現在存在する場合はトランザクションに参加し、現在トランザクションが存在しない場合は新しいトランザクションを作成します。

春のデフォルトのトランザクション。ほとんどの状況に適しています。

TransationDefinition.PROPAGETION.REQUIRED_NEW

新しいトランザクションを作成します。トランザクションが現在存在する場合は、現在のトランザクションを一時停止します。

は、元のトランザクションとは関係のない、新しいトランザクションを作成することを意味します。

TransationDefinition.PROPAGETION.SUPPORTS

トランザクションが現在存在する場合はトランザクションに参加し、トランザクションが存在しない場合は非トランザクションで実行を継続します。
この方法は非常にカジュアルで、持っていない場合は持っていません。

TransationDefinition.PROPAGATION.NOT_SUPPORTED

トランザクション以外の方法で実行する場合、現在のトランザクションは一時停止されます。
この方法は非常に困難です。持っていない場合は、サポートしないで無視してください。

TransationDefinition.PROPAGETION_NEVER

非トランザクション方式で実行し、トランザクションが現在存在する場合は例外をスローします。
この方法はより強力です。問題がなければ問題はありません。彼は全員に「私は決して事件をサポートしません」と宣言しました。

TransationDefinition.PROPAGETION_MANDATORY

現在トランザクションがある場合はトランザクションに参加し、現在トランザクションがない場合は例外をスローします。
この方法は、トランザクションが存在しない場合、全世界に直接エラーが報告されるため、最も困難であると言えます。

TransationDefinition.PROPAGETION_NESTED

トランザクションが現在存在する場合、現在のトランザクションのネストされたトランザクションとして実行するトランザクションを作成します。現在トランザクションが存在しない場合、この値は
と同等です。 TransationDefinition .PROPAGETION_REQUIRED

宣言トランザクション

Use

宣言トランザクションを使用する場合は、Springboot を見てください:

@Transactional
public void save(Object ob){

}

メソッドに @ を追加するだけですトランザクション アノテーションメソッドはトランザクションで管理できます。

ソースコード

アノテーションのソースコードを見てください。 トランザクション:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

@AliasFor("transactionManager")
String value() default "";


@AliasFor("value")
String transactionManager() default "";

Propagation propagation() default Propagation.REQUIRED;

Isolation isolation() default Isolation.DEFAULT;

int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;


boolean readOnly() default false;

Class<? extends Throwable>[] rollbackFor() default {};


String[] rollbackForClassName() default {};

Class<? extends Throwable>[] noRollbackFor() default {};


String[] noRollbackForClassName() default {};

}

デフォルト値

readOnly: 読み取り専用かどうか。デフォルトでは読み取りと書き込みの両方が可能です

timeout: トランザクション タイムアウト、デフォルトではタイムアウトなし

isolation: トランザクション分離レベル デフォルト: TransactionDefinition.ISOLATION_DEFAULT (上記の分離レベルを参照)

propagation: トランザクション伝播属性のデフォルト: TransactionDefinition.PROPAGATION_REQUIRED

Notes

  • 注釈はパブリック メソッドにのみ適用する必要があります

  • 自己呼び出しの問題: クラス内にアノテーション付きメソッドがなく、アノテーション付きメソッドを呼び出す場合、外部メソッドがアノテーションなしメソッドを呼び出すと、アノテーション付きメソッドはトランザクションを生成しません

以上がSpring トランザクションと宣言的トランザクションの使用を理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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