當前位置: 網站首頁 > 天9國際注冊

spring事務詳解(二)簡單樣例

2019-07-15來源:天9國際注冊

系列目錄

spring事務詳解(一)初探事務

spring事務詳解(二)簡單樣例

spring事務詳解(三)源碼詳解

spring事務詳解(四)測試驗證

spring事務詳解(五)總結提高

一、引子

在Spring中,事務有兩種實現方式:

    編程式事務管理: 編程式事務管理使用底層源碼可實現更細粒度的事務控制。spring推薦使用TransactionTemplate,典型的模板模式。 申明式事務管理: 添加@Transactional注解,并定義傳播機制+回滾策略?;赟pring AOP實現,本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。

二、簡單樣例

需求:

創建用戶時,新建一個用戶余額表。如果用戶余額創建失敗拋出異常,那么用戶表也回滾,即要保證“新增用戶+新增用戶余額”一起成功 或 回滾。

2.1 申明式事務管理

如下圖,只需要在service.impl層,業務方法上添加@Transactional注解,定義事務的傳播機制為REQUIRED(不寫這個參數,默認就是REQUIRED),遇到Exception異常就一起回滾。

REQUIRED傳播機制下:存在加入事務,不存在創建新事務。保證了當前方法中的所有數據庫操作都在一個物理事務中,當遇到異常時會整個業務方法一起回滾。

1 /** 2 * 創建用戶并創建賬戶余額 3 * 4 * @param name 5 * @param balance 6 * @return 7 */ 8 @Transactional(propagation= Propagation.REQUIRED, rollbackFor = Exception.class) 9 @Override10 public void addUserBalanceAndUser(String name, BigDecimal balance) {11 log.info("[addUserBalanceAndUser] begin!!!");12 //1.新增用戶13 userService.addUser(name);14 //2.新增用戶余額15 UserBalance userBalance = new UserBalance();16 userBalance.setName(name);17 userBalance.setBalance(new BigDecimal(1000));18 this.addUserBalance(userBalance);19 log.info("[addUserBalanceAndUser] end!!!");20 }

?

2.2 編程式事務管理

編程式事務管理,我們使用Spring推薦的transactionTemplate。我這里因為使用的是spring cloud的注解配置,實現用了自動配置類配置好了TransactionTemplate這個類型的bean.使用的時候直接注入bean使用即可(當然老式的xml配置也是一樣的)。如下:

1 /** 2 * 創建用戶并創建賬戶余額(手動事務,不帶結果) 3 * 4 * @param name 5 * @param balance 6 * @return 7 */ 8 @Override 9 public void addUserBalanceAndUserWithinTT(String name, BigDecimal balance) {10 //實現一個沒有返回值的事務回調11 transactionTemplate.execute(new TransactionCallbackWithoutResult() {12 @Override13 protected void doInTransactionWithoutResult(TransactionStatus status) {14 try {15 log.info("[addUserBalanceAndUser] begin!!!");16 17 //1.新增用戶18 userService.addUser(name);19 //2.新增用戶余額20 UserBalance userBalance = new UserBalance();21 userBalance.setName(name);22 userBalance.setBalance(new BigDecimal(1000));23 userBalanceRepository.insert(userBalance);24 log.info("[addUserBalanceAndUser] end!!!");25 //注意:這里catch住異常后,設置setRollbackOnly,否則事務不會滾。當然如果不需要自行處理異常,就不要catch了26 } catch (Exception e) {27 // 異?;貪L28 status.setRollbackOnly();29 log.error("異?;貪L!,e={}",e);30 }31 32 }33 });34 }

注意:

1.可以不用try catch,transactionTemplate.execute自己會捕捉異常并回滾。--》推薦

2.如果有業務異常需要特殊處理,記得:status.setRollbackOnly(); 標識為回滾。--》特殊情況才使用

三、總結

spring支持的這兩種方式都可以,個人認為大部分情況下@Transactional可以滿足需要。

中国现在赚钱的职业是什么 极速11选5投注技巧 福建快三同三遗漏 二分彩属于什么彩 江苏体彩十一选五前二走势图 澳洲快乐8开奖官网 东方6十1中奖查询表 11选5任三怎么倍投 新群英会20选5高手技巧 快乐双彩开奖视频 股票行情素材