V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ukipoi
V2EX  ›  问与答

请教一下 Spring 部分事物回滚的问题

  •  
  •   ukipoi · 2019-06-19 11:41:27 +08:00 · 996 次点击
    这是一个创建于 1779 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个类有 录入操作 和 更新操作。
    在 录入操作 中会在返回结果之前进行一次 更新操作。
    我现在希望的是 录入操作 不会被回滚掉但是更新操作进行回滚。
    而且录入操作必须在更新操作之前,不然更新就没有对象了

    @Autowired
    private xxxDAO dao;
    @Autowired
    private xxxAPI api;
    
    @Transactional
    public void fun(XXX xxx,YYY yyy){
    	/* do something */
    	dao.save(xxx);//保存数据到数据库
    	this.update(yyy);//更新一下数据库的数据(更新方法里会根据另一个模块的结果更新,先执行更新,如果另一个模块返回失败则要把更新的操作回滚掉)
    }
    
    @Transactional(propagation = Propagation.NESTED)
    public void update(XXX xxx){
    	/* do something */
    	dao.update(xxx)
    	if(!api.xxx){
    		TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    		/* do something */
        }
    }
    
    2 条回复    2019-06-19 13:02:22 +08:00
    zjp
        1
    zjp  
       2019-06-19 12:49:51 +08:00 via Android   ❤️ 1
    update()要独立回滚,事务传播性得用 requires_new。但是这样又会有隔离性问题,read uncommit 的隔离级别估计不合适。
    其实看起来 update()在 fun() 之后执行就能满足…
    ukipoi
        2
    ukipoi  
    OP
       2019-06-19 13:02:22 +08:00
    @zjp
    是的,我在 controller 里先调用 save 方法在调用 update 方法就可以了。
    不过出现这样的问题是设计问题还是其他问题?在正常业务中,所有出现我这样的问题的情况,都应该是在 controller 处理,还是有可能出现必须放在 save 方法中的情况?
    还有一点,请问关于 spring 的事物这方面的内容,从哪里开始学习比较好,网上找资料的话总感觉一知半解,没有个开头切入点学习。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   892 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:06 · PVG 07:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.