spring自带的事务管理器TransactionSynchronizationManager.registerSynchronization
maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.10</version>
</dependency>
回调方法
在TransactionSynchronization接口中,有多个回调方法可以覆盖:
beforeCommit(boolean readOnly):在事务提交前调用。
afterCommit():在事务提交后调用。
beforeCompletion():在事务完成前调用,无论事务是提交还是回滚。
afterCompletion(int status):在事务完成后调用,根据状态判断事务是提交还是回滚。
示例
代码:
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
for (String lockKey : lockKeys) {
stringRedisTemplate.delete(lockKey);
}
}
});
其实不写这么写也是可以的,直接在代码后面拼接redis删除逻辑也可以,finally里面加这个逻辑也是可以的。
transactionTemplate
为什么要用transactionTemplate呢?
之前一直用声明式事务@Transactional,但是有时它不生效,想要弄清楚原因及传播机制费时间,还不一定能够找到解法。那么换个思路,用其他事务试试,这也是用transactionTemplate的原动力。
使用
1、Application启动类加注解@EnableTransactionManagement。(最好加上,虽然不确定不加是是否有效)
2、需要使用它的类中注入transactionTemplate。
@Autowired
private TransactionTemplate transactionTemplate;
3、主逻辑部分。
Boolean版本。
Boolean flag = transactionTemplate.execute(new TransactionCallback<Boolean>() {
public Boolean doInTransaction(TransactionStatus status) {
int updateI = userMapper.delete(request);
System.out.println(0 / 0); // 模拟异常(实际代码中去掉)
return Boolean.True;
}
});
当然,这里的Boolean也可以换成其他类。
JsonResult版本。
JsonResult transactionResult = transactionTemplate.execute(new TransactionCallback<JsonResult>() {
public JsonResult doInTransaction(TransactionStatus status) {
JsonResult<Object> transactionResult = new JsonResult<>();
int updateI = userMapper.delete(request);
System.out.println(0 / 0); // 模拟异常
return transactionResult;
}
});
log.info(methodName+"操作_事务正常完成,transactionResult={}",JSON.toJSONString(transactionResult));
看了下代码,机制也比较简单。
如果正常执行,则提交,并返回结果。
如果异常了,则先回滚,再抛出异常,当然这里就不会返回结果了,直接会到外网的异常代码块。
1万+

被折叠的 条评论
为什么被折叠?



