1.问题
1、以前对事物的了解只是停留在声明式事物,配置xml,或使用注解,事物的传播行为也只用过REQUIRED和SUPPORTS,可以说对事物的了解很模糊。
2、直到在开发中遇到问题。。
问题的描述是:
年底跑定时任务,获取用户年底过期积分,并发送积分即将过期的消息提示;
过期积分做记录,并与积分做关联记录,涉及两表的操作;
数据量较多,循环保存,要做到每次循环都会手动提交,而不是做缓存最后提交;
事物的传播行为为默认的REQUIRED,二两个表操作涉及到了嵌套事物;
So。。。
解决办法:
1声明式事物方式
@Transactional(propagation = Propagation.REQUIRES_NEW)
2采用了编程式事物
事物的传播行为选择为:PROPAGATION_REQUIRES_NEW
public boolean updateExpireCredit(Credit credit) throws Exception { // 事务开始-方法级别 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); // 传播行为: 新建事务,如果当前存在事务,把当前事务挂起 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); def.setTimeout(30); // 事务状态 TransactionStatus status = tm.getTransaction(def); boolean falg = false; try { creditRepository.save(credit); tm.commit(status); falg = true; } catch (Exception e) { e.printStackTrace(); log.error("出现异常,事务回滚:{}", e); if (!status.isCompleted()) { tm.rollback(status); } throw e; } return falg; }