利用断言提高mybatis程序健壮性

在开发web应用程序时,我们会用到spring的事务和mybatis框架。现代的spring程序,一般使用spring注解来声明事务。一般来说,事务写在service层上,一个service方法里会调用若干个dao方法。一旦其中一个出了异常,整个service层会回滚事务。但是这样就绝对的安全了吗?至少在mybatis程序不是这样。
我们思考这样一种情况,程序员SQL错误。最常见的是update忘了写where条件。比如:

@Update("update account set balance = balance+#{amount}")
int addBalance(@Param("id") long id ,@Param("amount") BigDecimal amount);

这种低级错误有时候会发生的。如果成功执行了,那么将修改了所有账户的余额。或者说这种低级错误不会发生,但是如果传入的id错误呢?
比如传入的不是账户的id,而是其他表的主键。那么账户资金并没有修改到。
那么这种情况是不会抛出异常的,但是也绝对不能让事务内其他DML成功,怎么办呢?这里就必须要使用断言了。使用断言判断修改操作受影响的行数,如果不是预期的行数,那么就回滚事务。
再考虑下一种情况,高并发的情况。
比如充值操作。操作分两步,第一步修改订单状态从处理中为成功,第二步增加账户余额。

orderMapper.updateStatus(orderId,"SUCESS");
accountMapper.addBalance(accountId,amount);

这种情况如果在分布式的情况下会出现问题的。就是在第一步和第二步操作之间,假如有另外一台机器修改了该订单状态,那么一定会出现重复增加金额的情况。这个时候必须要判断受修改的行数。
但是不推荐使用Java断言关键字,我介绍一个断言框架,就是spring的断言工具。断言工具,apache、junit都有,但是这些需要导入额外的jar包。但是如果使用spring就不需要额外的jar包了,该jar位于spring-core项目中。
每次update之后使用断言来判断执行结果,是一种优秀的代码习惯,也是程序健壮必不可少的步骤。
秀一下我自己的代码:

Account account = accountMapper.selectByUserId(user_id);
notNull(account,"账户为空");
BigDecimal topFee = order.getAmount();
int addBalanceRows = accountMapper.addBalance(account.getId(), topFee);
isTrue(addBalanceRows==1,"余额未增加");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值