ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 一、概述 在Spring Boot中,当使用了spring-boot-starter-data-jpa(spring-boot-starter-jdbc也可以)依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,不需要任何额外配置就可以用@Transactional注解进行事务的使用; ## 二、简单使用 默认的,如果不做任何配置,springboot的事务控制在dao方法上,以单一的持久层方法作为事务控制的基础单元; 如果需要将一个或多个dao方法与某些业务组合来控制事务(出现异常就会回滚),那么很简单,使用@Transactional标注该方法(抽取到单一方法,比如service中的单一方法)即可; >[danger] > 1、实际开发中,通常在service层接口中使用@Transactional来对各个业务逻辑(组合了持久层dao方法)进行事务管理的配置; > 2、如果异常被try-catch了,事务就不回滚了,必须抛向被@Transactional注解的层,也就是说,@Transactional注解的代码里面,如果出现异常,就会产生事务回滚,但必须注意,**不能把该代码里面的异常自行捕获且不再抛出**; >举例: ``` 如果orderFlowPackage.order的方法有异常必须整体回滚,那么 正确的做法 @Transactional public ResponseObject orderFlowPackage(long cardId, long packageId) throws Exception { orderFlowPackage.order(0, cardId, packageId, CardOrderType.user_order_from_wechat, model.getCurLoginData().getCurStaffId()); return responseObj; } ``` 错误的捕获异常示例: ``` @Transactional public void planExecuting(CardOrderPackagePlan cardOrderPackagePlan) { // 去执行订购套餐 boolean isSuccess = false; String failReason = ""; long staffId = cardInfoDao.findById(cardOrderPackagePlan.getCardId()).get().getCardUserStaff(); try { orderFlowPackage.order(cardOrderPackagePlan.getPlanId(), cardOrderPackagePlan.getCardId(), cardOrderPackagePlan.getPlanPackageId(), CardOrderType.user_order_from_plan, staffId); } catch (Exception ex) { isSuccess = false; failReason = ex.getLocalizedMessage(); } } ``` ## 三、典型用法 ![](https://img.kancloud.cn/8b/df/8bdfc3d89510f82018ce9a90a3148b0b_815x625.png)