正常開發,我們一般會使用基於事務的註解來實現事務的機制,但是有的時候或者某種場景,完全通過註解是達不到效果的,比如 我們想完成以下的場景:
1 根據條件,手動回滾或者提交事務
2 獲取事務是否已經徹底完成的狀態
3 設置事務具體的回滾point等,一句話想更好靈活的去控制事務的使用,這個時候推薦自定義事務的實現,一般通過如下兩種方式
3.1 基於TransactionTemplate
使用TransactionTemplate 不需要顯式地開始事務,甚至不需要顯式地提交事務。這些步驟都由模板完成。但出現異常時,應通過TransactionStatus 的setRollbackOnly 顯式回滾事務。
TransactionTemplate 的execute 方法接收一個TransactionCallback 實例。Callback 也是Spring 的經典設計,用於簡化用戶操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
一般使用如下所示的代碼結構
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
try{
}
catch (Exception e) {
}
finally {
status.setRollbackOnly();
)
);
這個方法是可以由返回只
如果有異常的話,一定要使用status.setRollbackOnly進行回滾
3.2 基於PlatformTransactionManager
使用PlatformTransactionManager直接管理事務。簡單地通過一個bean引用給你的bean傳遞一個你使用的 PlatformTransaction對象。然後,使用TransactionDefinition和TransactionStatus對象就可以發起、回滾、提交事務。它會涉及到其它兩個對象TransactionDefinition和TransactionStatus,一般使用如下片段
//定義一個事務
DefaultTransactionDefinition def= new DefaultTransactionDefinition();
//設置事務的傳播級別
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//獲取事務的狀態
TransactionStatus status = transactionManager.getTransaction(def);
//提交事務;
transactionManager.commit(status);
//回滾事務
transactionManager.rollback(status);