Spring有兩種事務管理方式:編程式、聲明式。
Spring提供兩種方式的編程式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。
聲明式事務:註解@Transactional
編程式事務:TransactionTempale
採用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調方法,把應用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。
使用場景:調用支付寶/微信的支付接口,調用前先寫數據庫日誌記錄。
調用支付寶/微信的支付接口URL後,再記錄返回數據和是否成功,失敗。
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
payment.setTradeNo(tradeNo);
payment.setStatus(0);
payment.setDate(new Date());
persist(payment);
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
}
});
使用TransactionTemplate 不需要顯式地開始事務,甚至不需要顯式地提交事務。這些步驟都由模板完成。但出現異常時,應通過TransactionStatus 的setRollbackOnly 顯式回滾事務。
TransactionTemplate 的execute 方法接收一個TransactionCallback 實例。Callback 也是Spring 的經典設計,用於簡化用戶操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
該方法的方法體就是事務的執行體。
如果事務的執行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的實例。這是個抽象類,不能直接實例化,只能用於創建匿名內部類。它也是TransactionCallback 接口的子接口,該抽象類包含一個抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區別在於該方法沒有返回值,即事務執行體無須返回值。