springboot手動事務回滾
親測在使用@Transactional、@Transactional(rollbackFor = Exception.class)及catch異常之後 throw new RuntimeException();仍然不能解決執行緒中的事務回滾。下面使用執行緒所機制,進行整體的事務提交及事務回滾,程式碼如下:
在springboot啟動類上加 @EnableTransactionManagement 註解
執行緒類中添加以下程式碼
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
private Lock lock = new ReentrantLock();
// todo 業務處理方法 數據存儲異常 手動進行回滾
public void saveMsg(String message) throws Exception {
lock.lock();
TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
try {
//todo 具體業務,對資料庫的操作 start
test1Service.save(test1);
test2Service.save(test2);
//end
platformTransactionManager.commit(transaction);
} catch (Exception e) {
platformTransactionManager.rollback(transaction);
e.printStackTrace();
} finally {
lock.unlock();
}
}
註:如果無法用 @Autowired 程式啟動進行對象創建,可以使用init靜態注入,如果對象可以正常創建,下面程式碼可以忽略。
@Autowired
private static PlatformTransactionManager platformTransactionManager;
@Autowired
private static TransactionDefinition transactionDefinition;
@Autowired
public void init(PlatformTransactionManager platformTransactionManager,TransactionDefinition transactionDefinition
) {
DriverAlfaServerHandler.platformTransactionManager = platformTransactionManager;
DriverAlfaServerHandler.transactionDefinition = transactionDefinition;
}
此回滾方法親測有效。


