まず、取引のいくつかの基本簡単なレビューは、非常に深く、多くのオンラインのブログの話ではありません。
図1に示すように、4つのトランザクションの特性に:原子性、分離性、一貫性、永続性は省略する。
2、トランザクションの分離レベル:、シリアライズをコミットし、反復可能読み取りを読んで、非コミット読み取り(ダーティリードなど、すべてのレベルで起こるどのような問題を理解する必要があり、ここで、非反復可能読み取り、ファントムリード)
3は、トランザクションの伝播:トランザクションメソッドが別のメソッドを呼び出したときにトランザクション伝播の振る舞いがトランザクションを指し、このメソッドは、トランザクションを作成する方法でなければなりません。たとえば:methodAの取引方法は、methodBの取引方法を呼び出され、methodBは、発信者methodAそれの業務を実行し続け、または新しい実行に伝播行動methodB取引によって決定され、自分の業務を開始することです。デフォルト:PROPAGATION_REQUIRED
第二に、のは、簡単に復習しましょうのJavaの例外の階層を:
Throwableのは、例外処理メカニズムの基本的なタイプである(スロー)、またはキャプチャ(キャッチ)スローすることができたThrowable型のJavaのみインスタンス内のすべて間違っていたり、珍しいスーパークラスのJava言語です。
エラーと例外の例としては、2種類に分け。
エラーカテゴリは、内部エラーや資源の枯渇システムのJavaランタイムエラーを指します。アプリケーションは、そのクラスのオブジェクトをスローしません。もし
このようなエラーは、ユーザーに通知することに加えて、発生し、残りはプログラムの安全な終了を作ってみるです。
例外二つの枝があり、一つは、チェックが異常CheckedExceptionで、RuntimeExceptionが異常動作です。
RuntimeExceptionなど:NullPointerExceptionが、ClassCastExceptionが;
CheckedExceptionとして:のSQLException、によるにIOException I / Oエラー。
RuntimeExceptionは、Java仮想マシンの通常動作中にスローされることがあり、これらの例外のスーパークラスです。RuntimeExceptionが発生した場合、次に
指定されたエラーは、コードを書くためにプログラマによって引き起こされます。
CheckedException:一般的な外部エラーは、そのような異常はコンパイル時に発生し、Javaコンパイラの強力な
システムプログラムは、このような例外をキャッチするために、異常のtryキャッチかもしれ、このプログラムを置くためにあなたを求めて表示されます。
第三に、身近に利用、プロジェクトの総務
springbootは、自動的に私たちのためにデフォルトのトランザクションマネージャを設定するように、我々は別の記事https://www.cnblogs.com/enchaolee/p/11364025.htmlを参照してください。
ビジネス、@Transactionalこの注釈コーディング、などのための例外を処理中に何も少ない使用の取引のためのプロジェクトの実際の開発、中に私たちは、の詳細にについて話しましょう。
存在する場合1は、一部のプロパティ注釈のための特別な構成は、この方法はのRuntimeException(異常動作)がない場合ならば、トランザクション方法になってきた方法に@Transactionalコメントを追加した後、トランザクションは、ロールバックされますcheckedException(異常コンパイル時間が)、それはロールバックされません。だから、このような例外のために、我々は彼が投げたときにそれを行う方法をロールバックすることにしたい、私たちは@Transactionalコメントにポイントすると、以下の図を参照してください。
私たちは、注釈の赤の性質をマークし2つの数字があり、見ることができ、私たちはここに手動で特定のメソッドを実装するように構成することができますが、例外ロールバック・ロジックをスローします。例えば、我々が構成されることができる:@Transactional(rollbackFor = Exception.class)。
もちろん、2つのフィールドが設定されていません特定のロールバックする例外をスローすることができますがあります。noRollbackFor、noRollbackForClassName。
2は、キャッチした例外のために、業務に対処する方法
私たちは、トランザクション処理中に、手動で例外を捕捉し、問題がスロー行かせなかった場合は、手動でトランザクションをコミットします、例外が発生した場合でも、ロールバック、取引方法を指定する必要はありません。
例えば、我々はそう、ちょうどrollbackfor = Exception.classはロジックをロールバックする必要がある開発されたが、トランザクションはまだ次の行を挿入していない限り、提出された場合でも、ログレコードでください:
このコードは、異常を持っている必要はありませんが、これは推奨されません手動で実行投げたときに、このコードは多くのトランザクションのロールバックのコードになりますので、メンテナンスに助長されていません、または、適切に対処するためのより多くの春を支払わなければなりません。3、
図3は、我々はそれをロールバック例外を処理する方法を好きですか?
示されているように、CommonExceptionは我々が定義するグローバル例外クラスで、我々は特定のフォーマットに従って統一スローされた例外をキャッチすることができます。ここでは、関連するコードがあるCommonException
パブリッククラスCommonExceptionはのRuntimeExceptionを{延び
ストリングたerrMsg保護; //エラーメッセージがユーザに表示される
文字列detailMsg保護、特定の情報は、情報の他のパラメータのIDを含んでいてもよい//エラーが
CommonErrorCodeエラー保護; //エラーコード
保護オブジェクト・データ; //コンテンツを返します
公共CommonException(CommonErrorCodeエラー){
スーパー(error.getDesc())。
this.error =エラー。
this.errMsg = error.getDesc()。
this.detailMsg = error.getDesc()。
}
公共CommonException(CommonErrorCodeエラー、文字列たerrMsg){
スーパー(たerrMsg)。
this.error =エラー。
this.errMsg =たerrMsg。
this.detailMsg =たerrMsg。
}
公共CommonException(CommonErrorCodeエラー、文字列たerrMsg、文字列detailMsg){
スーパー(StringUtils.isEmpty(detailMsg)たerrMsg:?detailMsg)。
this.error =エラー。
this.errMsg =たerrMsg。
this.detailMsg = detailMsg。
}
公共CommonException(CommonErrorCodeエラー、文字列たerrMsg、Throwableの原因){
スーパー(たerrMsg、原因)。
this.error =エラー。
this.errMsg =たerrMsg。
this.detailMsg =たerrMsg。
}
公共CommonException(CommonErrorCodeエラー、文字列たerrMsg、文字列detailMsg、Throwableの原因){
スーパー(StringUtils.isEmpty(detailMsg)たerrMsg:?detailMsg、原因)。
this.error =エラー。
this.errMsg =たerrMsg。
this.detailMsg = detailMsg。
}
公共CommonException(CommonErrorCodeエラー、Throwableの原因){
スーパー(error.getDesc()、原因)。
this.error =エラー。
this.errMsg = error.getDesc()。
this.detailMsg = error.getDesc()。
}
パブリック文字列getErrMsg(){
たerrMsgを返します。
}
公共CommonErrorCode getError(){
リターンエラー。
}
パブリック文字列getDetailMsg(){
detailMsgを返します。
}
公共ボイドsetDetailMsg(文字列detailMsg){
this.detailMsg = detailMsg。
}
公共ボイドsetErrMsg(文字列たerrMsg){
this.errMsg =たerrMsg。
}
パブリックオブジェクトのgetData(){
データを返します。
}
公共CommonExceptionのsetData(オブジェクトデータ){
this.data =データ。
これを返します。
}
}
4、取引方法取引のメソッド呼び出しは、どのように対処します
私たちは、すなわちデフォルトを使用するトランザクションの伝播:まず、前提確認必要があり、我々は2取引法のA、Bがあることを前提とし、コールbは。
我々はNullpointExceptionでスローBと仮定した場合、及び、bが行っていない。(1)私たちが言っている以上に要求される特性に応じて、我々はそれがトランザクションにデフォルト設定されますように、この取引方法間のコールに春を知っています例外処理、Aによるトランザクション全体が、確かに構成ロールバックされますB、それが疑いを超えています。
bは、例外キャッチ異常である、とに投げていない、我々は上記の例で言うようにレコードのみをログに記録した場合(2)、私たちは、この例外は、なぜ考えることを見つけますか?
私たちは、トランザクションが分散されます、別のトランザクションメソッドを呼び出すときに、取引方法を可能にする、その春のトランザクション管理を知っています。ノート@Transactionalデフォルトの伝播メカニズムがPROPAGATION_REQUIREDです。再び要求される特性を見て:現在の方法は、トランザクション内で実行する必要があります。現在のトランザクションが存在する場合は、この方法は、そのトランザクションで実行されます。それ以外の場合は、新しいトランザクションを開始します
だから、パッド入りの内側のトランザクションにパディング法、同時合併取引を実行する時間です。請求書の異常同期が発生した場合、キャッチは捨てていない、キャプチャされてみてください。しかし、まだ方法doSetRollbackOnly DataSourceTransactionManagerクラスを実行するために、トランザクション・ロールバックをロールバック、rollbackOnly = trueを提供します。
例外がキャッチされているので、それは全体のトランザクションの実行をブロックしません。トランザクション全体の実装後、提出することを約束、我々はコミットロジックで、この抽象クラスAbstractPlatformTransactionManagerの外観を開きます
ここで私は、我々はこのクラスDefaultTransactionStatusを開いて、下に見ていき、あなたは赤いマーク具体的な実装方法を見ることができます。このアプローチを赤でマーク。
実行、isGlobalRollbackOnly DefaultTransactionStatusクラスにメソッドを実行rollbackOnlyの決意がtrueの場合、ロールバックログロジックをコミットし、プレイ所与のフレーズ「それはロールバック専用としてマークされているため、トランザクションはロールバック」。
5、いくつかの点に注意を払う必要があります
(1)メソッドは、publicとしてマークされたトランザクションを必要とし
(2)@Transactionalアノテーションのみサービスに書き込むことができ、コントローラは、それ以外の場合は404エラーを報告し、もはやではありません
トランザクションの場合には、すべての操作が読み取り操作している場合(3)は、トランザクションが読み取り専用トランザクションが読み取り専用トランザクションとしてマークされている場合、スプリングは、特定の読み取り専用トランザクションのために最適化することができ、トランザクションを設定することをお勧めリソースは、適切な最適化対策を手動でtrueに設定する必要が行うことができます。しかし、その後、例外をスローするようにバックCRUDメソッドを実行します。