SpringBootの@Transactionalトランザクション管理を使用します

アウトライン

トランザクションとは何ですか?ここでアカウントをクリアボブは今、2つの操作を必要とする$花5Wの銀行口座に銀行口座から転送しようとした場合、最初の1が小さな5Wで片付けされ、簡単な例であり、第二は置くことですインポートされた花のアカウントの5Wブロックの最初のステップと第2のステップは論外正常に動作している場合、我々はそれ以外の場合は屋根が暁明が満たされます、操作のうち最初のステップは、取り消すことができることを確認する必要があります。
そして、トランザクション管理は、この種の問題を解決するための有効な手段である、それは一連のアクションを保証いずれかの完了(コミット提出)、または任意のリンクエラーがすべて(ロールバックロールバックを)撤回します!

今、私たちは、取引の簡単な定義を与える:トランザクションは、ACID特性を満たすために、操作のセットです。
1.アトミック(原子性)
、トランザクションは、いずれかの不可分の最小単位、トランザクションのすべての操作と考えすべてが成功するか、すべてのロールバック失敗コミットされています。ロールバックは、ロールバックの際に、これらの変更を実行するように修正逆によって実行されるロールバックオフィス業務をログ、ロールバックログを達成するために使用することができます。
2.一貫性(一貫性)
トランザクションの実行前と後のデータベース一貫性のある状態です。コヒーレンシ状態では、読み取り結果データのすべてのトランザクションは同じです。
3.絶縁(アイソ)
最終提出する前に、変更を行う会社は、他のトランザクションは表示されません。
4.永続性(耐久性)は
トランザクションがコミットされると、それは永遠に行われたデータベースに保存されます修正。システムがクラッシュした場合でも、トランザクションの結果の実装が失われることはできません。耐久性を確保するためにログをやり直します。

SpringBootサポートトランザクション管理:

1.プログラムによるトランザクション管理
2.宣言的トランザクション管理

トランザクション管理の2つの方法の単純な比較:
プログラムによるトランザクション管理は、ビジネス・ロジック・コードでトランザクション管理ドーピングコードを必要とする、春の開発に、この非侵襲的な方法の逆を提唱しました。上に構築された宣言型トランザクション管理AOP、その本質は、前後に傍受する方法であり、その後、ターゲットメソッドが始まる前に、トランザクションを作成したり、参加し、ターゲット・メソッドを実行した後、実装に合わせて、トランザクションをコミットまたはロールバックします。図から分かるように、ビジネスコードを作成する宣言的トランザクション管理が汚染されていません。宣言型トランザクション唯一の欠点は、それが最もきめの細かいことにある唯一のメソッドレベルに適用することができ、あなたはブロックレベルに適用することができ、プログラムのトランザクションとして行うことはできません。しかし、このような要求があっても、多くの代替方法がある、例えば、トランザクション管理コードブロックを必要とすることができるように独立した方法であると。

使いやすい@Transactionalのアノテーションベースの宣言的トランザクション管理、この記事の内容は、導入することです。

@Transactionalの使用

@Transactionalは、インターフェース、インターフェースメソッド、クラス、クラスのメソッドに適用することができます。クラスとして使用する場合、すべてのパブリックメソッドのクラスには、トランザクション属性のこのタイプを持っています。、@Transactionalは、ラベルの付いた方法を例にしてください、チェックされない例外は、実装プロセスに投げられたとき、それはロールバックします。(何?あなたがチェック例外であるものを私に尋ね、それはコンパイル時にコンパイラがチェックアウトされ、そのようなヌルポインタ例外として、非のRuntimeException及びそのサブクラスやエラーなどの異常、異常および非異常が十分に理解されています唯一のプログラムを実行し、これは非異常で例外をスローします実行し、それをチェックアウトしてコンパイルすることができます別の例IOExceptionが、これは)確認の異常です。

次に、我々は単にテストする必要があります。(本明細書で使用する場合、MySQLデータベース)

試験の前に、だけでなく、使い慣れたMySQLの友人が知っているかもしれシンプルを追加し、MySQLは、実行に成功隠されている場合、この文は、終了すると、デフォルトの自動コミットモード、別のトランザクション内の各文であります暗黙的なトランザクションの失敗はロールバックされた上で、取引の種類は、取り組んでいます。通常のトランザクション管理のために、それは、トランザクションの関連事業のグループ内にある、自動コミットモードのデータベースをオフにする必要があります。
新しい関連情報へのトランザクション管理、アクセスを春と後で問題が私たちを心配する必要はありません発見したときに、私はこの問題を検討し、開発者はの傷ついた心を話す春が自動的に偽の基礎となる接続に属性を提出されました

私は、ユニットテストをJUnitの単純データの各部分は、2つの異なるデータ・テーブルに追加される試験方法を記述し、これら二つの動作は、一つのトランザクションは、次の2つのテーブル構造とみなしてテストを開始します以前、2つの表は、データがありません。
ここに画像を挿入説明
ここに画像を挿入説明

テスト1:トランザクション管理を使用しないでください。

    //注入两个dao层爸爸
	@Autowired
	private SingleGraphDao singleGraphDao;
	@Autowired
	private GraphInfoDao graphInfoDao;
	
	@Test
	public void testA_InsertSingleGraph() {
		//创建两个实体类测试对象,并为他们简单的赋值
		GraphInfo test1 = new GraphInfo();
		test1.setGraphInfoId(1L);
		test1.setCity("夏威夷");
		
		SingleGraph test2 = new SingleGraph();
		test2.setGraphInfoId(1L);
		test2.setGraphAddr("xxx.jpg");
		
		//将两个插入操作视为一个事务
		//先执行第一个数据的插入
		graphInfoDao.insertGraphInfo(test1);
		//简单的抛出一个异常
		int i = 1;
		if (i == 1) {
			throw new RuntimeException();
		}
		//之后再执行第二个数据的插入
		singleGraphDao.insertSingleGraph(test2);
	}

このとき、データテーブルの記録状態
ここに画像を挿入説明
ここに画像を挿入説明
この時点では、ダーティデータを生じます。

テスト2:オープン・トランザクションのサポート、@Transactionalは、ラベル、データベースのレコードをマークし、前に削除します

    //注入两个dao层大佬
	@Autowired
	private SingleGraphDao singleGraphDao;
	@Autowired
	private GraphInfoDao graphInfoDao;
	
	//相比于之前的代码,这里只是多了个@Transactional注解
	@Test
	@Transactional
	public void testA_InsertSingleGraph() {
		//创建两个实体类对象,为他们简单的赋值
		GraphInfo test1 = new GraphInfo();
		test1.setGraphInfoId(1L);
		test1.setCity("夏威夷");
		
		SingleGraph test2 = new SingleGraph();
		test2.setGraphInfoId(1L);
		test2.setGraphAddr("xxx.jpg");
		
		//将两个插入操作视为一个事务
		//先执行第一个数据的插入
		graphInfoDao.insertGraphInfo(test1);
		//简单的抛出一个异常
		int i = 1;
		if (i == 1) {
			throw new RuntimeException();
		}
		//之后再执行第二个数据的插入
		singleGraphDao.insertSingleGraph(test2);
	}

試験を行った後、我々は、データテーブルの状態を見て
ここに画像を挿入説明
ここに画像を挿入説明
見ることができ、問題なく最初の挿入操作のコードが、しかし最初の挿入操作は、これを取り出したのでためのRuntimeExceptionトランザクション全体を皿状すなわち、ロールバック操作(ロールバック)

どうでしょうか?Springのトランザクション管理は、ああ、非常に簡単ではありません

最後に書かれた:のみ春AOPの性質によって決定されたパブリックコメントの方法、のための有効な@Transactional。あなたが使用@Transactional注釈可視性の方法で、プライベートまたはデフォルトで保護している場合、それは無視され、例外はスローされません。クラスメソッドは、このクラスの他のメソッドを呼び出す以内にデフォルトでは、呼び出し側の外部からの唯一の方法は、つまり、AOPプロキシをキャプチャされるメソッドは、アノテーション@Transactionalが変更と呼ばれていても、行動の内政が発生することはありません。

おすすめ

転載: blog.csdn.net/u013568373/article/details/90543219