トランザクションの失敗の春8つの主要な原因

これは、公共の数字を切り替える:Javaの技術スタックマイクロチャネル公共番号を

1つのデータベースエンジンは、トランザクションをサポートしていません。

MySQLのここで例えば、MyISAMのエンジンがトランザクション操作をサポートしていない、InnoDBはトランザクションエンジンがサポートされているが、一般的に取引がInnoDBのを使用するサポートしています。

公式のMySQLのドキュメントによると:

https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html

デフォルトのストレージエンジンの先頭からのMySQL 5.5.5は、次のとおりです。InnoDBのデフォルトは前:MyISAMテーブル、これは根本的なエンジンがトランザクションをサポートし、その後は良い方法を従事していないいないことに注意することは価値があるようにします。

2春によって管理されていません。 

以下の例に示すように:

// @Service 
パブリック クラス OrderServiceImpl 実装OrderServiceの{ 

    @Transactional 
    公共 ボイドupdateOrder(オーダー順序){
         // 更新順序
    } 

}

この時点で場合 の注意事項はコメントし、このクラスにはビーンにロードされることはありません、このクラスは春によって管理されることはありません、トランザクションの性質が無効になります。 @Service

この方法の3が公開されていません

以下から春の公式文書:

プロキシを使用している場合、あなたは唯一の公共の可視性を持つメソッドに@Transactionalのアノテーションを適用する必要があります。あなたは@Transactionalアノテーションを付ける保護、プライベートまたはパッケージ可視メソッドを実行すると、エラーは発生しませんが、注釈付きの方法が設定され、トランザクションの設定を示しません。あなたは非パブリックメソッドに注釈を付ける必要がある場合にAspectJの使用を考えてみましょう(下記参照)。

おそらくことを意味 非パブリックメソッドの使用は、あなたが開くことができる場合、このメソッドはのみ、それ以外のトランザクションは失敗しません、公共のために使用することができる プロキシモード。 @Transactional AspectJ

問題自体を呼び出す4

二つの例を見てください:

@Service
 パブリック クラス OrderServiceImpl 実装OrderServiceの{ 

    公共 ボイド更新(オーダー順序){ 
        updateOrder(順序)
    } 

    @Transactional 
    公共 ボイドupdateOrder(オーダー順序){
         // 更新順序
    } 

} 

更新方法は、上記追加されません 注釈、呼び出しがき updateOrder方法の仕事に注釈を付けupdateOrder方法、取引を? @Transactional @Transactional

次の例で見てみましょう:

@Service
 パブリック クラス OrderServiceImpl 実装OrderServiceの{ 

    @Transactional 
    公共 ボイド更新(オーダー順序){ 
        updateOrder(順序)
    } 

    @Transactional(伝播 = Propagation.REQUIRES_NEW)
     公共 ボイドupdateOrder(オーダー順序){
         // 更新順序
    } 

} 

更新方法の増加は、updateOrderが追加 、新しいオープントランザクション作業を新しいオープンAトランザクションを? @Transactional REQUIRES_NEW

これら二つの例の答えは次のとおりです。どんなに!

彼らは春のプロキシクラスを経由せずに、そのような独自の方法の転送に、自分自身を呼び出すことが起こったため、デフォルトでは当たり前の古典的な問題であり、効果のみ外部コール取引を、取ります。

解決策の一つは、別のメソッドを呼び出し、これはエレガントではないクラスで自分自身を注入し、その後、対象物を注入され、」を参照して、別の実行可能な選択肢である春にトランザクションで別のトランザクションを開く方法は?「この記事。

5データ・ソースは、トランザクションマネージャを設定されていません

@Bean
 公共PlatformTransactionManagerのTransactionManager(データソースのdataSource){
     リターン 新しいDataSourceTransactionManager(データソース); 
}

 

上記に示したように、トランザクション・マネージャが設定されていない場合は、現在のデータソースは、それは無意味です!

図6は、トランザクションをサポートしていません。

次の例を考えてみます。

@Service
 パブリック クラス OrderServiceImpl 実装OrderServiceの{ 

    @Transactional 
    公共 ボイド更新(オーダー順序){ 
        updateOrder(順序)
    } 

    @Transactional(伝播 = Propagation.NOT_SUPPORTED)
     公共 ボイドupdateOrder(オーダー順序){
         // 更新順序
    } 

}

Propagation.NOT_SUPPORTED: 詳細は「を参照してくださいすることができ、存在しているトランザクションが現在保留されている場合、彼らは、トランザクションを実行していないと述べたトランザクション分離レベルと伝播のメカニズム、この記事では」。

彼は、業務を実行するためにはサポートを提供していない、と効果を取るために、トランザクションが良くないこと!

7例外が食べられます

これは、より多くのシーンが表示されるのです。

// @Service 
パブリック クラス OrderServiceImpl 実装OrderServiceの{ 

    @Transactional 
    公共 のボイドupdateOrder(受注オーダー){
         試み{
             // 更新順序 
        } キャッチ{ 

        } 
    } 

} 

異常な食事は、トランザクションが今ロールバックされるか、捨てないで!

 

8例外の種類エラー

上記の例は、例外をスロー:

// @Service 
パブリック クラス OrderServiceImplの実装OrderServiceの{ 

    @Transactional 
    公共 のボイドupdateOrder(受注オーダー){
         試み{
             // 更新順序 
        } キャッチ{
             スロー 新しい例外を( "更新错误" ); 
        } 
    } 

} 

RuntimeExceptionなど、あなたが他の異常なロールバックをトリガーにしたい場合は、あなたがノートにそれを設定する必要があり、::デフォルトのロールバックがあるため、このようなトランザクションが有効ではありません

@Transactional(rollbackFor = Exception.class)

この設定だけ 例外クラスとサブクラス。 Throwable

概要

トランザクション障害の8種類のシーンをまとめたもので、実際には、ほとんど発生このホワイトペーパーでは、例外が投げた例外のこれらの3種類、食べないことです彼らの呼び出し、です。

 

 

おすすめ

転載: www.cnblogs.com/dalianpai/p/12164356.html