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

0x01:データベースがトランザクションをサポートしていない場合、トランザクションがデータベースで動作しているため、データベースは失敗
します。たとえば、MySQLを使用していて、エンジンがMyISAMである場合、MyISAMエンジン自体はトランザクションをサポートしていないため、トランザクションは機能しませんが、InnoDBに変更すると可能になります。

0x02:ServiceクラスはSpringによって管理されていません。Spring
のトランザクションはAOPに基づいているため、ServiceクラスがSpringによって管理されていない場合、それはSpring Beanになります。@ Transactionalアノテーションが追加されても、トランザクションは無効です。

0x03:内部呼び出し
トランザクションのないメソッドは、このクラスのトランザクションのあるメソッドを呼び出し、ロールバックされません。Springのロールバックはプロキシモードを使用して生成されるため、このクラスのトランザクションでメソッドを呼び出すトランザクションのないメソッドの場合、プロキシトランザクションを生成せずにthis.xxx()を介して直接呼び出されるため、トランザクションは機能しません。一般的な解決策は「機密解除」です。

@Service
public
 
class
 
OrderServiceImpl
 
implements
 
OrderService
 
{

    
public
 
void
 update
(
Order
 order
)
 
{
        updateOrder
(
order
);
    
}

    
@Transactional
    
public
 
void
 updateOrder
(
Order
 order
)
 
{
        
// update order
    
}

}

0x04:デフォルトのトランザクション処理方法を使用します

SpringトランザクションはデフォルトでRuntimeExceptionのロールバックを行い、ロールバックなしでRuntimeExceptionを継承しません。javaの設計では、RuntimeExceptionを継承しない例外はCheckExceptionまたはIOExceptionなどの通常の例外であると考えられるため、これらの例外はJava構文で処理する必要があります。これらの一般的な例外については、Springはデフォルトで処理されているため、デフォルトではロールバックされません。すべての例外がロールバックされることを示すために、rollbackfor = Exception.classを追加できます。

0x05:トランザクションはパブリックメソッドに
のみ適用できます@ Transactional アノテーションはパブリックメソッドにのみ適用できます。保護されたメソッド、プライベートメソッド、またはデフォルトの可視性メソッドで@Transactionalアノテーションを使用すると、これは無視され、例外はスローされません。

0x06:データソースはトランザクションマネージャで構成されていません


// 其中 dataSource 框架会自动为我们注入
    
@Bean
    
public
 
PlatformTransactionManager
 txManager
(
DataSource
 dataSource
)
 
{
        
return
 
new
 
DataSourceTransactionManager
(
dataSource
);
    
}

トランザクションを使用したい場合、トランザクションマネージャーは構成されておらず、他はすべて無駄になっています。

元の記事を17件公開 Likes0 訪問数224

おすすめ

転載: blog.csdn.net/weixin_42531204/article/details/104932363