一筐愿望 2019-09-30 00:33 采纳率: 60%
浏览 229
已采纳

Java:为何事务的实际执行结果与预期不符

@Controller
@EnableAutoConfiguration
public class SampleController {


    @Autowired
    private WeiboRepository weiboRepository;

    @Autowired
    private TwitterRepository twitterRepository;

    @RequestMapping("/postWeibo")
    @ResponseBody
    public void postWeibo() {
        Weibo weibo = new Weibo("Weibo");
        weiboRepository.save(weibo);
        postTwitter();
    }

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void postTwitter() {
        Twitter twitter = new Twitter("Twitter");
        twitterRepository.save(twitter);
        throw new RuntimeException();
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }

}

代码逻辑:添加一条微博的同时添加一条推特,postTwitter手动抛出异常模拟回滚
预期结果:Twitter表由于抛出异常造成回滚,Weibo表正常添加
实际结果:虽抛出异常但Twitter、Weibo表均正常添加

请问我已经设置了@Transactional,事务级别为REQUIRED表明postTwitter会单独开启新的事务,为何实际执行结果与预期不符合呢?

  • 写回答

6条回答 默认 最新

  • 请叫我七点起床 2019-09-30 17:56
    关注
    public void postWeibo() {
            Weibo weibo = new Weibo("Weibo");
            weiboRepository.save(weibo);
            postTwitter();
    }
    
    

    代码中的postTwitter();相当于this.postTwitter();这样调用是不行的。参考https://blog.csdn.net/dapinxiaohuo/article/details/52092447。然后你把

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
        public void postTwitter() {
            Twitter twitter = new Twitter("Twitter");
            twitterRepository.save(twitter);
            throw new RuntimeException();
        }
    

    方法放到其他的service中,然后本service注入前面说的service,你再试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元