Springコアイシュー復習3:Springトランザクションの伝播メカニズム、トランザクションの失敗状況、iocの理解

1. スプリングはどのように開発を簡素化しますか? 春のメリットは?

Spring はフレームワークですが、コンテナーでもあります生态

IOC是一种理论思想,DI是具体的实现方式

1) Spring は、DI、AOP、ボイラープレート コードの排除により、エンタープライズ レベルの Java 開発を簡素化します
2) Spring フレームワークに加えて、Spring を Web サーバーなどのさまざまな分野に拡張するコア フレームワーク上に構築された巨大なエコシステムもあります、REST、モバイル開発、および Nosql
3) 介入が少なく、コード汚染が非常に少ない
4) さまざまなアプリケーション サーバーから独立して、Spring フレームワークに基づくアプリケーションは、Write Once、Run Anywhere を真に実装できます
5) Spring の ioc コンテナ ビジネスの複雑さを軽減します
6) Spring の AOP サポートにより、セキュリティ、トランザクション、ログなどの一般的なタスクの集中処理が可能になり、再利用が向上します 7) Spring
の ORM および DAO は、サードパーティの永続レイヤーとの優れた統合を提供します
8) Spring の高度なオープン性は、アプリケーションが Spring に完全に依存することを強制せず、開発者は Spring フレームワークの一部またはすべてを自由に選択できます

2.Springのトランザクション伝播メカニズムとは?

Spring には 7 つのトランザクション伝播メカニズムがあります。

  1. REQUIRED: デフォルトの伝播機能で、現在のトランザクションがない場合は新しいトランザクションを作成し、現在のトランザクションがある場合はこのトランザクションに参加します
  2. サポート: 現在トランザクションがある場合は、現在のトランザクションに参加します。トランザクションがない場合は、非トランザクション方式で実行します
  3. 必須: 現在トランザクションがある場合は現在のトランザクションに参加し、現在のトランザクションが存在しない場合は例外をスローします
  4. REQUIRED_NEW: 新しいトランザクションを作成し、現在のトランザクションが存在する場合は中断します
  5. NOT_SUPPORTED: 非トランザクション方式で実行し、現在のトランザクションがある場合は現在のトランザクションを一時停止します
  6. NEVER: トランザクションを使用しないでください。現在のトランザクションが存在する場合、例外がスローされます
  7. NESTED: 現在のトランザクションが存在する場合はネストされたトランザクションで実行され、現在のトランザクションがない場合は新しいトランザクションが作成されます

REQUIRED、REQUIRES_NEW、NESTED 比較:
REQUIRED(spring默认级别):外部メソッドと内部メソッド、いずれかのメソッドが異常な場合、すべてロールバックされます
1) 内部スロー例外:
外部にキャッチがない場合、この例外は上にスローされ、外部にロールバックされます。
外部メソッドがキャッチされた場合、Spring トランザクション マネージャーは外部メソッドに対して UnexpectedRollbackException メソッドを上向きにスローします。
したがって、キャッチされるかどうかに関係なく、内部例外が異常である限り、外部例外は確実にロールバックします。

2) 外部スロー例外: 内部ロールバック

REQUIRES_NEW:外部例外、内部ロールバックなし; 内部例外、外部が捕捉されたかどうかに応じてロールバックするかどうかを決定
1) 内部例外:
外部が捕捉された場合、外部はロールバックされません
;

2) 外部スロー例外:内部はロールバックしません

NESTED:外部例外、内部ロールバック; 内部例外、外部キャッチの有無に応じてロールバックするかどうかを決定

内部メソッドと外部メソッドは、ネストされたトランザクションです。原則として、内部トランザクションは外部トランザクションにセーブポイントを作成し、内部トランザクションは例外の後でこのセーブポイントにロールバックします。

1) 内部例外:
外部が捕捉された場合、外部はロールバックされ
ません 外部が捕捉されなかった場合、外部はロールバックされます

2) 外部スロー例外:内部ロールバック

3.春の取引実施の原則は?

Spring フレームワークを使用する場合、トランザクションを実装するには 2 つの方法があります。1 つは、编程式事务ユーザーがコードを介してトランザクションの処理ロジックを制御することであり、もう 1 つは声明式事务@Transactional アノテーションを介して実装することです。

実際には、トランザクションの操作はデータベースによって制御される必要がありますが、ユーザーがビジネス ロジックを操作しやすくするために、Spring はトランザクション機能の実装を拡張しました。通常、プログラムによるトランザクションはほとんど使用されず、 @Transactional アノテーションを追加することでより多くの実装が行われます. このアノテーションを追加すると、トランザクションの自動コミット機能がオフになり、Spring フレームワークによって制御されます.

トランザクション操作は AOP のコアの実施形態です.メソッドに @Transactional のアノテーションが付けられると、Spring はこのクラスに基づいてプロキシ オブジェクトを生成し、このプロキシ オブジェクトを bean として使用しますこのプロキシ オブジェクトのメソッドを使用する場合、トランザクション処理がある場合は、まず自動送信をオフにしてから、特定のビジネス ロジックが実行されます。ビジネス ロジックにタスクの例外がない場合は、プロキシ ロジックが直接送信され、例外が発生した場合はロールバック操作が実行されます。

4. 春の取引はいつ失敗しますか?

  1. 未被spring管理: Spring トランザクションを使用する前提は、オブジェクトが Spring によって管理されている必要があり、トランザクション メソッドが配置されているクラスが Bean オブジェクトとして読み込まれている必要があることです。
  2. 数据库不支持事务: MySQL を例にとると、InnoDB エンジンはトランザクションをサポートしていますが、MyISAM、MEMORY などはトランザクションをサポートしていません。
  3. 事务方法没有被public修饰: java、private、default、protected、public の 4 つのアクセス修飾子がありますが、@Transactional アノテーションは public の変更されたメソッドにのみ適用できます。
  4. 使用final修饰了方法: トランザクション メソッドが final で装飾されている場合、aop はプロキシ クラスでメソッドを書き換えることができず、トランザクションは有効になりません。同様に、静的に変更されたメソッドは、プロキシを介してトランザクション メソッドに変換することはできません。
  5. 同一个类中方法调用: 同じクラスのメソッドにトランザクションがありません。このメソッドでトランザクションを持つメソッドが呼び出された場合、そのトランザクションも無効になります。プロキシ オブジェクトのメソッドではなく、クラス自体のメソッドが呼び出されるためです。
  6. 多线程调用: 2 つの操作が同じスレッドにないため、取得したデータベース接続が異なり、2 つの異なるトランザクションであるため、ロールバックされません。
  7. 错误的传播行为: Spring は 7 つの伝搬動作を定義します. 伝搬動作パラメーターを伝搬属性で指定できます. 現在, REQUIRED, REQUIRES_NEW, NESTED のみが新しいトランザクションを作成し、その他は非トランザクション方式で実行されるか、例外をスローします.
  8. 自己try...catch...掉了异常: 例外がスローされない場合、Spring はプログラムが正常であると見なし、ロールバックしません。
  9. 手动抛出了错误的异常: デフォルトでは、Spring は RuntimeException と Error のみをロールバックし、通常の Exception はロールバックしません。他の例外のロールバックをトリガーする場合は、次のようにアノテーションで構成する必要があります。 @Transactional(rollbackFor = Exception.class)
    10 嵌套事务回滚多了.: つまり、内部トランザクションで例外が発生します。 try、catch の結果、外側のトランザクション ページが表示されます。ロールバックが行われました。

5. Spring でサポートされる Bean のスコープは何ですか?

  1. シングルトン: デフォルト スコープ、シングルトン Bean、Spring IOC コンテナーごとに 1 つの Bean インスタンスのみ
  2. プロトタイプ: プロトタイプ モード。プロトタイプによって定義された Bean を取得するために getBean メソッドが使用されるたびに、新しい Bean インスタンスが生成されます。
  3. request: リクエストごとに Bean インスタンスを作成するリクエストが完了すると、Bean は無効になり、Spring のガベージ コレクターによってリサイクルされます。
  4. session: 基本的にリクエストのスコープに似ています, 同じセッション セッションは Bean インスタンスを共有し, 異なるセッション セッションは異なる Bean インスタンスを使用します. このスコープは、Spring が Web アプリケーションで使用される場合にのみ有効です。
  5. global-session: グローバル スコープ、すべてのセッションが同じ Bean インスタンスを共有するため、すべてのセッションで共有されるストレージ変数を宣言する場合は、このグローバル変数を global-session に保存する必要があります。

6. spring ioc の理解、原則、実装について話してください。

合計:

ioc は理論的なアイデアであり、DI は具体的な実装です。

元のオブジェクトはユーザーによって制御されます. spring ioc を使用すると、オブジェクト全体を spring に渡して、管理を支援できます.

DI: 対応する属性の値を特定のオブジェクトに注入する Dependency Injection、@Autowired、populateBean は属性値の注入を完了します

コンテナー: オブジェクトを格納し、マップ構造を使用して格納します。通常、Spring には 3 レベルのキャッシュがあり、singletonObjects は完全な Bean オブジェクトを格納します。Bean の作成から使用、破棄までのライフサイクル全体は、すべてコンテナーによって管理されます。

ポイント:
1. コンテナー (beanFactory、DefaultListableBeanFactory) を作成し、いくつかのパラメーター (BeanPostProcessor、Aware インターフェースのサブクラス) およびその他の属性を Bean ファクトリーに設定します。
2. Bean オブジェクトをロードして解析し、作成する Bean オブジェクトの定義オブジェクト beanDefinition を準備します (xml またはアノテーション解析プロセス) 3. beanFactoryPostProcessor
の処理、拡張ポイントは次のとおりです: PlaceHolderConfigurSupport、ConfigurationClassPostProcessor
4. 登録関数BeanPostProcessor の後で便利です Bean オブジェクトは特定の拡張機能を完了します
5. リフレクションを介して BeanDefinition オブジェクトを特定の Bean オブジェクトにインスタンス化します
6. Bean オブジェクトの初期化プロセス (カスタム オブジェクト属性割り当て、コンテナー オブジェクト属性割り当て Aware インターフェイス、呼び出しbeanPostProcessorBeforeInitialization、init-method メソッドの呼び出し、beanPostProcessorAfterInitialization の呼び出し)
7. 完全な Bean オブジェクトを生成します。これは、getBean メソッドを介して直接取得できます。
8. 破棄プロセス

おすすめ

転載: blog.csdn.net/xueping_wu/article/details/126441375