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:
  •     @Bean(name = "detDataSource")
        public DataSource getDataSource() {
            return createDataSource();
        }
        @Bean(name = "detTransactionManager")
        public PlatformTransactionManager txManager(@Qualifier("detDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
  • データソース2:
  • @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) {