情景:
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 ****(参数);这样子就可以了