其他分享
首页 > 其他分享> > 十一、spring自身调用事务失效及两种解决方法- -示列验证

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

作者:互联网

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默认的事务传播

 

标签:事务,调用,String,spring,void,失效,示列,方法,public
来源: https://www.cnblogs.com/jiarui-zjb/p/13339247.html