数据库Java web

@Transactional 事务手动回滚及提交后操作

2020-04-22  本文已影响0人  任未然

一. 概述

在java开发中我们经常用到@Transactional进行事务处理, 但往往有时候会发现事务不生效, 这是它的一个代理机制造成的, 今天我们来说说几个事务失效的场景及手动设置事务方法

二. 事务失效场景

  1. 一个有@Transactional的方法被没有@Transactional方法调用时,会导致Transactional作用失效。

  2. 对非public方法进行事务注解。@Transactional 将会失效。

  3. Transactional 事务配置属性中的propagation 属性配置的问题。

  4. 业务代码被try{}catch(){}了, 这种是最容易犯错的

三. 手动设置事务回滚

3.1 方式一

    // 事务管理器
    @Autowired
    private DataSourceTransactionManager transactionManager;
    @Transactional
    public void save(User user) {
        // 创建一个事务
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 显式设置事务名称是只能通过编程完成的操作
        def.setName("SomeTxName");
        // 设置事务策略
        // 支持当前交易;如果不存在,请创建一个新的。类似于同名的EJB事务属性。这通常是事务定义的默认设置, 并且通常定义事务同步作用域。
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 开始事务
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 在这里执行您的业务逻辑
            // db操作
            // 提交事务
            transactionManager.commit(status);
        } catch (Exception ex) {
            // 事务回滚
            transactionManager.rollback(status);
            throw ex;
        }
    }

3.2 方式二

@Transactional  //事务的注解
public class UserServiceImpl implements UserService{
    @Autowired
    UserMapper userMapper;
    
    @Override
    public void updateUser(User user) throws Exception {        
        try {
            userMapper.updateUser(user);
        } catch (Exception e) {
        //强制手动事务回滚
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    
}

了解更多事务的机制请前往->Spring-事务机制

四. 事务提交后操作

@Transactional  //事务的注解
public class UserServiceImpl implements UserService{
    @Autowired
    UserMapper userMapper;
    
    @Override
    public void updateUser(User user) throws Exception {        
        userMapper.updateUser(user);
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                // 事务提交后操作
            }
        });
    }
    
}
上一篇 下一篇

猜你喜欢

热点阅读