spring boot 事务方法中调用事务方法

菜园小火车 2019-01-18 11:58:23
目的:
A,B同时被注解 @Transactional(rollbackFor = Exception.class)
A()中调用B(),B方法中抛出异常的时候只回滚B()中的事务,不影响A()事务的执行。
@Transactional(rollbackFor = Exception.class)
public void A() throws Exception {
User user = new User();
user.setUserName("test1");
user.setUserPassword("password1");
user.setUserSex(1);

userMapper.insertOne(user);

User user1 = new User();
user1.setUserName("test2");
user1.setUserPassword("password2");
user1.setUserSex(0);

userMapper.insertOne(user1);

B();
}

@Transactional(rollbackFor = Exception.class)
public void B() throws Exception {
System.out.println("addUser3");

User user1 = new User();
user1.setUserName("test3");
user1.setUserPassword("password3");
user1.setUserSex(0);

userMapper.insertOne(user1);

throw new Exception("3333333333333333333");
}

尝试方法:
1, 修改B注解为 @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
2, 修改A中调用为((UserService) AopContext.currentProxy()).B();
均失败。

在一个没有 @Transactional,通过currentProxy()去调用一个注解了@Transactional,则可以实现B的事务。
...全文
1674 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cainiao1923 2020-03-05
  • 打赏
  • 举报
回复
方案正确 ,需求奇怪
菜园小火车 2019-01-23
  • 打赏
  • 举报
回复
A() 事务依旧存在, 控制在A()
亲爱的Joe 2019-01-23
  • 打赏
  • 举报
回复
那A()的事务问题如何解决的?
菜园小火车 2019-01-21
  • 打赏
  • 举报
回复
自己解决。 方式是:B()中用@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) 在A() try catch B()的异常,调用方式为((UserService) AopContext.currentProxy()).B() try { ((UserService) AopContext.currentProxy()).B() } catch(Exception e) { } 直接调用B()的时候,代理的类不会启动一个切面去调用B()的事务,只能通过直接调用proxy的B()来启动事务切面。
wzwdev1980 2019-01-18
  • 打赏
  • 举报
回复
应当抛出runtimeException
亲爱的Joe 2019-01-18
  • 打赏
  • 举报
回复
只给A方法添加事务,B方法抛出异常,去掉事务

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧