Javaの総務・スプリング総務についてのコメント

トランザクション(ACID)

 

コンピュータ用語では、データベースにアクセスすることを意味し、各種データ、プログラム実行部を更新してもよいです。

 

トランザクション(ACID)の4つの特徴:

 

アトミック(不可分):トランザクションは、作業データベースの論理的な単位であるが、原子の作業単位のデータ変更のいずれかのすべてを実行又は全て実行されないことを意味します。

 

一貫性(整合性):トランザクションが完了すると、すべてのデータが一貫した状態でなければなりません。関連するデータベースでは、すべてのルールは、すべてのデータの整合性を維持するためにトランザクションを修正するために適用されなければなりません

 

絶縁(アイソレーション):トランザクションの実行は、他の企業が影響を受けることはできません。

 

そして、持続性(耐久性):トランザクションがコミットされると、物事の操作が永続的にDBに格納されます。でも、コミット操作は、トランザクションデータベースシステム出会い障害が発生した場合に失われることはありません。

 

ファイブ分離レベル:

これはPlatfromTransactionManagerデフォルトの分離レベルでデフォルトでは、デフォルトのデータベースのトランザクション分離レベルを使用します。

非コミット読み取り(コミットされていない読み取り):非反復読み取りダーティリード、ファントムが発生する可能性が読み込み

(コミット読み取り)コミット読む:回避のダーティ・リード。しかし、繰り返し不可の読み込み、およびファントム読み込みが起こること

反復可能読み取り(反復可能読み取り):ダーティリードおよび反復不能読み取りが、ファントム読み込みが起こることを防止。

シリアライズ(直列化可能):上記の問題のすべてを読んで避けてください。

 

 

ISOLATION_DEFAULT:これはデフォルトのデータベースのトランザクション分離レベルを使用し、PlatfromTransactionManagerデフォルトの分離レベルです。

 

また、対応する4つのJDBC分離レベルを有します。

 

ISOLATION_READ_UNCOMMITTED:これは、コミットされていないトランザクションそのデータを見ることができる外国取引を充電しないと約束し、最低のトランザクション分離レベルです。ダーティー読み取り

シーン:トランザクションがまだ小さなアカウントは万元を確認するためにチェックし提出していないながら、皆のための金融賃金の終わり、小さなアカウントには、万元を作った、と彼は興奮しました。しかし、今回は、もう一つの手0をプレイするために、独自の金融間違いを発見した後、トランザクション、再発行の千元提出業務、再確認の少量をロールバックし、Aの空の喜びにそのケーリー千元を見つけましたフィールド。

 

ISOLATION_READ_COMMITTED:読み込みまたとないなく、ダーティリードできます。これは、達成するために、「瞬時に共有読み取りロック」と「排他的な書き込みロック」することができます。読み出しデータトランザクションが他のトランザクションがデータの行へのアクセスを継続できますが、書き込みコミットされていないトランザクションは、銀行へのアクセスを他のトランザクションを防ぐことができます、読むには(主にデータ値の変更を参照)コミット。Oracleのデフォルトレベル

シーン:小さなオープン勘定取引は、千元の量を確認し、彼は成熟度を唱え費やしています。この時間は、アリペイは自動的に、(100元、この控除は、他のものの操作であり、提出されました)100元の口座から引き落とさ小さな今回は900元となって再びバランスをチェック(結果は矛盾している2件の引き合いに事で発生しました)。

ISOLATION_REPEATABLE_READ:このトランザクション分離レベルの防止のダーティリード、反復不能読み取ります。しかし、ファントム読み込みが発生することがあります。マジックリーディングは、(主に変更する行の数を意味します)。MySQLのデフォルトレベル

シーン:小さなオープン勘定取引は、千元の量を確認し、彼は彼のアカウントをチェックしたレコードを転送しない、この時間は、彼は成熟度を唱えて過ごしています、アリペイ自動的に引き落とさ100元(の口座から引き落とさ100元)が動作するために何か他のもので、提出された、彼はまだ$ 1000そのバランスを確認し、その後、私の妻は)チェックアカウントレコードが突然、それはファントム読み取りが起こった今回の2を発見し、800ドルを投入しました

 

ISOLATION_SERIALIZABLE:これは最も高価ですが、最も信頼性の高いトランザクション分離レベルのコスト。トランザクションが順次実行として処理されます。キュー内のSerializeすべてが、同時に、非常に低い効率を許可されていません。

 

 

 

トランザクションの伝播:

 

*同じトランザクションことを確認します

それは新しい(デフォルト)を作成するために存在していない場合PROPAGATION_REQUIREDは、現在のトランザクションをサポート

PROPAGATION_SUPPORTSは現在のトランザクションをサポートし、そうでない場合、トランザクションを使用しないでください

PROPAGATION_MANDATORYはない場合は、例外をスローし、現在のトランザクションをサポート

*保証は同じトランザクションではありません

PROPAGATION_REQUIRES_NEWトランザクションが存在した場合、現在のトランザクションを中断し、新しいトランザクションを作成します

トランザクションは現在のトランザクションを保留し、存在する場合、非トランザクションの方法で実行されているPROPAGATION_NOT_SUPPORTED

非トランザクションの方法で実行されているPROPAGATION_NEVERは、トランザクションがある場合は、例外をスロー

現在のトランザクションが存在する場合、ネストされたトランザクションを実行し、PROPAGATION_NESTED

 

 

春のトランザクション障害の条件

 

@Transactionalいくつかのシーンが頻繁に発生しました:

@Transactionalメソッドがプライベートに適用され、公共のボイド@Transactionalは、インターフェースのメソッドに適用され追加されていない場合、通常の方法で呼び出されるインタフェースは、メソッド次にかかわらず、コールの、インターフェイスメソッド@Transactional無効に適用すると、プライベートまたはパブリックで、効果的な@Transactionalに追加されますインターフェースメソッドの後に、直接インターフェース方式と呼ば存在一般的なクラスは、メソッドは、このクラスがインターフェイスメソッドの呼び出しを介して共通のインターフェースである、無効@Transactionalインターフェイスに追加され、有効な@Transactionalは、それがクラスがインターフェイスメソッドを呼び出し、有効である、方法をインタフェースに追加しました@Transactionalは、インターフェースメソッドに加え、それは、有効なプライベートメソッドクラス呼び出しであります

 

無取引方法Aの春の時間は、デフォルトの方式総務(PROPAGATION_REQUIRED)Bを呼び出し、あなたはBを呼び出すために、このメソッドを使用する場合、メソッドBはのRuntimeExceptionをスローし、この時間は、方法Bのトランザクションではありません、と背中をロールされることはありません。

@サービス

パブリッククラスEmployeeService {

@Autowired

プライベートEmployeeDao employeeDao。

保存します。public void(){

{試します

this.saveEmployee(); //ここでは、このコールは、オープントランザクションは、データが保存されますされません

}キャッチ(例外e){

e.printStackTrace();

}

}

@Transactional(伝播= Propagation.PROPAGATION_REQUIRED)

//ここでは、有効にならない事項かどうかPROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEWです

ます。public void saveEmployee(){

従業員=新しい従業員();

employee.setName( "zhangsan");

employee.setAge( "26";

employeeDao.save(従業員)。

新しいのRuntimeExceptionを投げます();

}

}

JDKのダイナミックプロキシ。場合にのみ、トランザクションは直接呼び出される動的プロキシを生成します。SpringIoC容器内に返されたオブジェクトの呼び出しではなく、実際のオブジェクトのプロキシオブジェクトです。そして、ここで、これはEmployeeService実際のオブジェクトではなく、プロキシオブジェクトです。

 

ソリューション:

(指定されていない場合はrollbackFor、デフォルトは例外RuntimeExceptionロールバックである)、このような使用;なしの方法のsaveEmployeeのデフォルトのトランザクションまたはトランザクション、およびキャッチ投げ新しいのRuntimeExceptionメソッドA()、保存オープン取引法では1、これは、取引方法を保存することです。()(新規のRuntimeExceptionをスローするようにしてください、そうでない場合は例外が取得プロセスで、同じ意志をバック圧延されない)、次のように:

@Transactional()//オープン情勢

保存します。public void(){

{試します

this.saveEmployee(); //ここ呼び出しは、このトランザクションは失敗し、データが保存されます。

}キャッチ(例外e){

e.printStackTrace();

新しいのRuntimeExceptionを投げます();

}

}

 

リリース元の4件の記事 ウォンの賞賛0 ビュー38

おすすめ

転載: blog.csdn.net/a970066364/article/details/104736992
おすすめ