0
点赞
收藏
分享

微信扫一扫

关于SpringMvc中的事务@Transactional


情景:



     SpringMVC   Dubbo 远程调用 业务层

     在业务层Facade实现类中   用Dubbo 远程调用 业务层  事务不回滚

   如下:

    @Override

@Transactional (rollbackFor=Exception. class )

public boolean receAward(Long userId ) throws BusinessException {



                   /**

                   * 当这个方法抛出异常  其他操作都会回滚  唯独下面领接口不会回滚 为什么呢?

                   */

                    //操作1

                 issuccess = couponFacade .gradRed****(参数)

                //测试1   //操作2

                 CpsCouponType record = new CpsCouponType();

                   record .setId(1L);

                   record .setDesc( "测试事务是否回滚此操作" );

                   couponService .updateCpsCouponType( record );

                   //测试2    //操作3

                   test();

                    //领奖了记录一下    //操作4

                     CpsActiveSignAward cpsAward = new CpsActiveSignAward();

                    cpsAward .setSignconfId( vo .get(0).getId());

                      cpsAward .setRecordId( cpsActiveVo .getId());

                     cpsAward .setUserId( userId );

                      lotteryService .insertCpsActiveSignAward( cpsAward );

                      //操作5

                    CpsActiveSignRecord ins = new CpsActiveSignRecord();

                    ins .setLastDaydate( new Date());

                    ins .setUserId( userId );

                    ins .setDayNum( cpsActiveVo .getDayNum()+1);

             ins .setId( cpsActiveVo .getId());

             lotteryService .update( ins );

             int i = 1/0;   //这里故意抛异常

             return issuccess ;

  }

    //这个测试  也是放着本 业务层里面  

     @Override

    public void test() {

   CpsActiveSignRecord ins = new CpsActiveSignRecord();

    ins .setDayNum(111);

   ins .setId(1);

   lotteryService .update( ins );

  }

上面是我写的一些测试情况;

经过运行发现  所有的事务都回滚了  只有操作1没有回滚;

猜想:由于操作1  是通过dubbo远程调用的方法;  消息已经发出去了;操作已经执行成功了;然后当前业务层 所有的操作的事务还没有提交  所以能够回滚;  恩,应该是这样 哈哈哈哈

解决方案:

  将  这个 方法    couponFacade .gradRed****(参数) 的实现   放到了 couponService  业务层中

后在这里直接调用 couponService. gradRed ****(参数);这样子就可以了

举报

相关推荐

0 条评论