不知道大家在实际开发的过程中,有没有遇到过类似的情况:比如有这么一个定时任务,需要定时处理一些超时未付款的订单。然后你查询所有符合条件的记录(假设有10条记录),接着for循环遍历每一个订单,每个循环体都要执行大量的业务,比如商品库存回退,订单状态修改,业务流水添加,消息推送等。你前五个循环都执行成功了,可是执行第六个循环的时候突然抛出一个异常,导致你前面五个执行成功的订单都事务回滚了,就有种三国的赤壁之战,曹军铁索连舟,一荣俱荣,一损俱损的感觉,是不是很蛋疼?你还真别笑,我接手公司项目的时候,还真的就看到前面的开发这样写代码。没办法,既然现在是咱接手,还就得老老实实的填坑了。
解决方案其实很简单,只需要一两段代码就能解决,本人亲测有效,当时测试的方式是:查询的10条记录,设置第6条出现异常,然后在10个循环都结束完后,发现只有第6条记录保持原样(异常时事务回滚),而它前面的5条和后面的4条都正常执行,并没有受影响。
我的项目用的是ssm框架,使用spring自带的定时任务,下面开始上伪代码:
先是OrderTimer.java类:该类是获取所有符合要求的记录,也就是获取这个集合,然后开始遍历执行每条符合要求的记录,注意具体执行的业务要封装到另一个方法中,也就是封装到业务层处理,不单单只是因为代码规范,更主要的是因为封装在另一个方法,才能更随心所欲的设置事务的传播属性。