インタビューの質問:春の宣言的トランザクション

次のコードシナリオがありAクラスメソッドが注釈でa1マークされておらず@Transactionala2メソッドが@Transactional注釈でマークされている場合、メソッドでメソッドをa1呼び出しa2ます。トランザクションはこの時点で開始されますか?

トランザクションを開始しません。a1このメソッドはAターゲットクラスのネイティブメソッドです。を呼び出すa1と、メソッドは直接ターゲットクラスA入り、呼び出されます。ターゲットクラス内のA唯一のa2ネイティブメソッドには、@Transactional注釈が付けられa1ます。ここa2呼び出されるのは直接実行されるa2ネイティブメソッドであり、プロキシオブジェクトを作成することによって呼び出されることはありません。なのでTransactionInterceptor、に入らないinvokeメソッドは、トランザクションを開きません。

ことをこの時点で場合a1、メソッドにマーク@Transactional注釈、a2メソッドはマークしません@Transactionalノートをが、a1アクセス修飾子のアプローチがそれであるprotectedで、a1でメソッドを呼び出すa2方法トランザクションを開始しますか?

トランザクションを開きません。@Transactional動作メカニズムはAOPに基づいており、AOPは動的プロキシを使用して実装されており、動的プロキシはJDKまたはCglibのいずれかです。上記の分析によると、JDK動的プロキシメソッドの場合、ターゲットクラスのターゲットメソッドがインターフェイスで定義されていること、つまり、publicプロキシされるには変更されたメソッドである必要があることがわかりますCglibメソッドの場合、プロキシクラスはターゲットクラスのサブクラスであり、理論的にプロキシ化publicおよびprotectedメソッドできますが、Springがトランザクション拡張を現在のターゲットクラスに適用できるかどうかを判断できる場合、ターゲットクラスのpublicメソッドをトラバースするため、Cglibメソッドもpublicメソッドに対してのみ有効です

Springフレームワークで宣言的トランザクション処理はどのように実装されていますか?

Springコンテナが各シングルトンBeanを初期化すると、コンテナ内のすべてのBeanPostProcessor実装クラスをトラバースしてそのpostProcessAfterInitializationメソッドを実行します。AbstractAutoProxyCreatorクラスのpostProcessAfterInitializationメソッドを実行すると、コンテナ内のすべてのアスペクトをトラバースして、現在インスタンス化されているBeanに一致するアスペクトを見つけます。ここでは、トランザクション属性アスペクトを取得し、@Transactional注釈とその属性値を見つけて、取得したアスペクトに基づいてプロキシオブジェクトを作成します。デフォルトでは、JDK動的プロキシを使用してプロキシを作成します。ターゲットクラスがインターフェースの場合はJDK動的プロキシを使用し、それ以外の場合はCglibを使用します。プロキシの作成プロセスでは、現在のターゲットメソッドに対応するインターセプターが取得されます。このとき、TransactionInterceptorインスタンスが取得されます。そのinvokeメソッドでは、トランザクションが開始され、ロールバックされます。トランザクション操作が必要な場合、Springはターゲットクラスを呼び出します。ターゲットメソッドがトランザクションを開始する前に、例外を呼び出してトランザクションをロールバックし、呼び出しの完了後にトランザクションを送信します。新しいトランザクションを開始する必要があるかどうかは、@Transactionalアノテーションで構成れたパラメーター値に基づい決定されます。新しいトランザクションを開始する必要がある場合は、Connection接続を取得してから、接続の自動コミットトランザクションfalseを手動送信に変更します。ターゲットクラスのターゲットメソッドが呼び出されると、例外が発生した場合にcompleteTransactionAfterThrowingメソッドが開始されます

その実現原理を教えてください。

クラス場合Aに表示されている@Transactional注釈が、春のコンテナが起動し、クラスがAプロキシクラスを作成するにはB、クラスは、AすべてのpublicプロキシクラスのメソッドがしますBクラス、対応するプロキシメソッドを持っている呼び出しAの1 publicに対応するプロキシ方式を入力するメソッドをでの処理

唯一のクラス場合Ab(使用する方法publicに変更が)にマーク@Transactional注釈、Springコンテナが起動し、クラスがあるAプロキシクラスを作成することBが、唯一のクラスAbプロキシメソッドを作成するには、クラスを呼び出すAb方法は、対応するプロキシを入力しますメソッドで処理されるか、クラスのA他のpublicメソッドを呼び出すか、クラスメソッドを入力Aして処理します。プロキシクラスにメソッドを入力する前に、クラスのメソッドTransactionInterceptor最初に実行されinvoke、新しいトランザクションを開くかどうか、トランザクション処理全体のロジック完了し、ターゲットメソッドの実行中にトランザクションをロールバックする必要があるかどうかを監視し、ターゲットメソッドの完了後にトランザクションを送信します。等

Springフレームワークはトランザクションロールバックを実装していますか?それはすべてのタイプの例外に対してトランザクションロールバック操作を実行しますか?

Springは、すべてのタイプの例外に対してトランザクションのロールバック操作を実行するわけではありません。デフォルトでは、Unchecked ExceptionErrorおよびRuntimeException)に対してのみトランザクションのロールバック操作実行します

公開された94元の記事 ウォンの賞賛0 ビュー722

おすすめ

転載: blog.csdn.net/qq_46578181/article/details/105458054