Transaction之坑:判断sql执行结果,主动促使事务rollback

Redis之坑:spring-data-redis中的Redis事务
Redis之坑:理解Redis事务
Redis之坑:Redis与MySQL中事务的区别
Transaction之坑:数据库事务
Transaction之坑:Spring中配置Transaction与不配置有何区别
Transaction之坑:分析sql执行结果,主动促使事务rollback


有关事务回滚的其他问题Spring事务回滚疑难详解


场景

JavaWeb开发,在开启事务的Service层方法中,编写业务逻辑时,经常会使用到如下两种方式:

  • 手动抛出异常(如果你没有配置 一般异常事务回滚,请抛出 RuntimeEception
int resultInt = merchantCollectMoneyMapper.updateMerchantBalance(pmsAppTransInfo);
if(resultInt != 1){
	logger.info("更新商户账户余额失败,商户ID:"+mercid +",结束时间:"+ UtilDate.getDateFormatter()+"。更新金额:"+ pmsAppTransInfo.getOrderamount());
	throw new RuntimeException("手动抛出");
}else{
   //修改流水表状态
}
  • 使用 TransactionAspectSupport 编程式实现手动回滚
int resultInt = merchantCollectMoneyMapper.updateMerchantBalance(pmsAppTransInfo);
if(resultInt != 1){
	logger.info("更新商户账户余额失败,商户ID:"+mercid +",结束时间:"+ UtilDate.getDateFormatter()+"。更新金额:"+ pmsAppTransInfo.getOrderamount());
	TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
}else{
   //修改流水表状态
}

Summary: 上述两种方式都是通过对 Dao|Mapper 执行结果分析,决定 transaction 是否 rollback


问题

  • 不是说TransactionManager 会根据service层方法throwsException自动 决定transaction回滚吗?
  • 那么还有必要分析SQL语句的执行结果吗?
  • 执行失败肯定会抛出异常,然后自动回滚的吧?

解决

  • 图1:一个 数据为空 的表
    这里写图片描述
  • 图2:使用不存在的主键执行 update 操作
    这里写图片描述

console: 受影响的行:0

表明:
尽管SQL操作的数据行不存在,并不会有 Exception 抛出,结果仅仅是: r e s u l t s = 0 results=0 results=0

summary: 受影响的行为 0,同样意味着 业务逻辑执行失败,而且此时并不会产生 ExceptionTransaction 仍会被 commit,如果这个方法包含 一系列 write 操作,自然会产生 脏数据。显然这不是我们所期望的,所以,在这种情况下,我们需要分析SQL执行后的结果,来决定是否应该 主动 促使事务 rollback


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值