码迷,mamicode.com
首页 > 编程语言 > 详细

十一、spring自身调用事务失效及两种解决方法- -示列验证

时间:2020-07-19 15:59:21      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:map   auto   none   通过   记录   param   新建   over   create   

1.事务失效-自身调用(通过REQUIRES、REQUIRES_NEW传播属性):自身调用即调该类自己的方法。
同类中方法1(不存在事务)去调用方法2(存在事务),则方法2无法保证该方法的事务性。
示列说明:OrderServiceImpl.insertAndUpdateOrderInfo方法中upateData(updateParam) 发生异常时,insertData(insertParam) 未发生回滚
备注:自身调用时候,无论是以下哪种传播属性均是无效的,因为自身调用时的子方法压根就不会被AOP 代理拦截到以下的这两种方式均经过验证,无法保证子方法事务的有效性
@Transactional(propagation = Propagation.REQUIRES)
@Transactional(propagation = Propagation.REQUIRES_NEW)

技术图片
@Controller
@RequestMapping("/trans")
public class TransactionalController {

    @Autowired
    OrderService orderService;

    @RequestMapping("/test.do")
    @ResponseBody
    public void getIndex(HttpServletRequest request, HttpServletResponse response, Model model) {

        orderService.doSomeThing();

    }

}

@Service
public interface OrderService {

    /*
    *添加订单和修改其他订单信息
    * */
    public void doSomeThing();

}



@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    TransBusiness transBusiness;

    @Override
    public void doSomeThing() {

        insertAndUpdateOrderInfo();

    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void insertAndUpdateOrderInfo(){
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
        String updateTime = dateFormat.format(date);

        //步骤1:插入订单记录信息
        String[] insertParam = {"555555555", "977723233", updateTime, updateTime};
        transBusiness.insertData(insertParam);

        //步骤2:修改订单记录信息
        String[] updateParam = {"1111111111", updateTime, "1"};
        transBusiness.upateData(updateParam);
    }

}



@Service
public class TransBusiness {

    @Autowired
    JdbcTemplate dalClient;

    public void insertData(String[] param) {
        Map<String, Object> resultMap = new HashMap<>();
        String sql = "INSERT INTO test_order (`order_no`, `cust_no`,create_time,update_time) VALUES (?, ?,?,?)";

        int i = dalClient.update(sql, param);
        System.out.println("TransBusiness>>>insertData" + i);
        resultMap.put("插入的记录数", i);
    }

    public void upateData(String[] param) {
        Map<String, Object> resultMap = new HashMap<>();
        String sql = "update test_order set order_no =?,update_time=? ? where id= ?";

        int i = dalClient.update(sql, param);
        System.out.println("TransBusiness>>>upateData" + i);
        resultMap.put("修改的记录数", i);
    }

}
View Code

技术图片

2.1自身调用事务失效解决方法1—在父方法中添加事务
OrderServiceImpl.insertAndUpdateOrderInfo方法中当步骤1执行完成后,数据库中并不会存在该订单记录。当执行步骤2时发生了异常,整个事务发生了回滚。说明才方法解决了1自身调用事务失效的问题。
备注:此处的@Transactional等同于  @Transactional(propagation = Propagation.REQUIRED)  表示支持当前事务,如果没有事务就新建一个事务,这是常见的选择,也是spring默认的事务传播

技术图片

 

十一、spring自身调用事务失效及两种解决方法- -示列验证

标签:map   auto   none   通过   记录   param   新建   over   create   

原文地址:https://www.cnblogs.com/jiarui-zjb/p/13339247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!