springboot@Transactionalトランザクションが有効でないいくつかのソリューション
5331 ワード
Springbootトランザクションが有効でないいくつかのソリューション
最近はビジネスで変なシーンに遭遇したり
@Transactional注釈の後、2つのデータを挿入し、2つ目に異常が発生した場合、1つ目はロールバックせず、長い間調べ、インターネットでも資料を探して長い間見ていたが、問題は解決され、事務が発効しない可能性のあるいくつかの原因をまとめた. mysqlのMyISAMエンジンはロールバックをサポートしていません.トランザクションを自動的にロールバックする必要がある場合は、mysqlのエンジンをInnoDBに設定する必要があります. 業務において異常を投げ出す場合、本来取引マネージャによって捕捉されるべき異常は、手動catchで処理するか、あるいは取引結果が具体的な業務ニーズを満たしていない場合、手動catchで異常を業務処理する必要がある場合、catchで手動で取引TransactionAspectSupportをロールバックする必要がある.currentTransactionStatus().setRollbackOnly()またはcatchで自発的に異常を投げ出すthrow new RuntimeException(). デフォルトのspringトランザクションはRuntimeExceptionのみを取得し、非実行時異常でもトランザクションロールバックが必要な場合は@Transactional注記にrollbackfor=Exceptionを追加できます.classプロパティ; プロジェクトにはトランザクションマネージャが配置されていません(大きな穴!私が出会ったのはこれです)、コンフィギュレーションクラスまたはコンフィギュレーションファイルに配置する必要があります.本人のコンフィギュレーションクラスを例にとると、プロジェクトはマルチデータソースなので、異なるデータソースを構成するトランザクションマネージャを区別します. データソース1: データソース2:
2つのトランザクションマネージャが異なるbeanNameを構成していることがわかります.次に、トランザクション制御が必要な場所にトランザクションマネージャのnameを加えるだけで完璧に解決できます.
最近はビジネスで変なシーンに遭遇したり
@Transactional注釈の後、2つのデータを挿入し、2つ目に異常が発生した場合、1つ目はロールバックせず、長い間調べ、インターネットでも資料を探して長い間見ていたが、問題は解決され、事務が発効しない可能性のあるいくつかの原因をまとめた.
@Bean(name = "detDataSource")
public DataSource getDataSource() {
return createDataSource();
}
@Bean(name = "detTransactionManager")
public PlatformTransactionManager txManager(@Qualifier("detDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "shardDataSource")
public DataSource getDataSource() {
return buildDataSource();
}
@Bean(name = "shardTransactionManager")
public PlatformTransactionManager txManager(@Qualifier("shardDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
2つのトランザクションマネージャが異なるbeanNameを構成していることがわかります.次に、トランザクション制御が必要な場所にトランザクションマネージャのnameを加えるだけで完璧に解決できます.
@Override
@Transactional(value = "detTransactionManager",rollbackFor = Exception.class)
public int updateOrInsert(BaseRequest<BankTemplateDto> param) {