spring自带的事务管理器,及事务工具类,transactionTemplate等

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));

看了下代码,机制也比较简单。
如果正常执行,则提交,并返回结果。
如果异常了,则先回滚,再抛出异常,当然这里就不会返回结果了,直接会到外网的异常代码块。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值