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
);
}
トランザクションを使用したい場合、トランザクションマネージャーは構成されておらず、他はすべて無駄になっています。