springboot設定雙資料來源,事務@Transitional註解的一些問題
阿新 • • 發佈:2021-02-10
記一個最近遇到的問題,等後面瞭解springboot中事務管理的原始碼之後會來更新詳細說明
· 關於springboot中多資料來源的配置,檢視之前的文章
專案場景:
由於最近做的專案中遇到多資料來源的業務場景,就在思考一個問題,如果一個操作裡面包含了多個數據庫操作,並且這些資料庫操作的資料來源不止一個。需要使用事務來,保持資料一致性。
問題描述:
為了能夠使得多個數據庫操作能保持資料一致,就會使用到事務,但是如果使用springboot的@Transitional註解來做事務會報錯
@Override
@Transactional (rollbackFor = Exception.class)
public void testData(){
mysqlDataMapper.updateTest();//操作資料庫A
syncDataDao.updateTest();//操作資料庫B
throw new RuntimeException();
}
錯誤資訊:
No qualifying bean of type ‘org.springframework.transaction.PlatformTransactionManager’ available: more than one ‘primary’ bean found among candidates: [mysqlTransactionManager, oracleTransactionManager]
原因分析:
從提示資訊可以看出,原因是因為配置了多個數據源,存在多個事務管理器PlatformTransactionManager解決方案:
可以在@Transitional中新增事務屬性,指定事務管理器:
transactionManager = “mysqlTransactionManager”
但是這樣只能對指定的資料來源啟動事務。其他有待研究方案