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