业务背景
业务那边想要统计下我们这边每天注册商户成功和失败的数量,你看看怎么给他弄下这个功能
功能实现
TransactionSynchronizationManager.registerSynchronization,发现这是spring事务提供的注册回调接口的方法。
在事务注解方法中,通过该方法注册事务回调接口后,spring会在事务提交/回滚前后调用注册的回调接口的对应方法,方法如下:
- suspend:在spring开启新事务,获取connection之前会调用
- resume:开启新事务失败时会调用
- flush:没调用
- beforeCommit:事务提交前会调用
- beforeCompletion:事务提交前会调用,在beforeCommit之后)
- afterCommit:事务提交后会调用
- afterCompletion:事务提交后会调用,在afterCommit之后
了解TransactionSynchronization的用法后,业务代码如下
@Transactional(rollbackFor = Exception.class)
public Integer registerCustomer(LvmsDelegateDTO newDelegateDTO) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
if (TransactionSynchronization.STATUS_COMMITTED == status) {
lvmsDelegateBO.insert();
} else if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {
lvmsDelegateBO.insert();
}
}
});
return lvmsDelegateBO.insert(newDelegateDTO);
}
如果status为STATUS_COMMITTED表示方法正常,事务已提交,需要插入成功记录,如果status为STATUS_ROLLED_BACK则说明发生了异常,事务已回滚,则插入失败记录,完美!!