spring中事务嵌套事务Propagation.REQUIRES_NEW传播行为疑问

有一个问题,spring中事务的注解方式
在service层的一个方法配置事务

@Transactional(value = "edwManager", rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public String edwDataSync(String xmlJson){
    for (int i = 0; i < 10; i++){
        操作数据库插入A表
    }
    for (int y = 0; y < 10; y++){
        操作数据库插入B表
    }
    }

疑问,事务传播方式如果使用REQUIRES_NEW 这种,那这个方法事务一共起了几个。
A表循环插入了10次,B表也插入了10次

Propagation.REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

阅读 8.2k
2 个回答

你的注解是写在service上面的,所以只有其它开了事物的方法执行你这个service方法才会被挂起,二你在这个方法里面调用的应该不是业务方法,掉的应该是dao 的方法,所以你这个只有一个事物。

新手上路,请多包涵

1,spring声明式事务管理是基于AOP实现的,而@Transactional注解是标注在方法上,也就是说AOP "拦截" 的是方法,所以只有加了@Transactional注解的方法才会存在事务管理。比如,A方法加了该注解,A方法内部调用了B方法,但是B方法没有加该注解,则B方法将不会被事务管理。
2,回到你的这个问题,如果在调用edwDataSync方法之前已经存在事务M了,那么Propagation.REQUIRES_NEW这种事务传播要求先将事务M挂起,然后新开一个事务N来管理edwDataSync中的逻辑。当N提交或者回滚之后继续事务M。
3,事务M和事务N是相互隔离的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题