美文网首页数据库Java web
@Transactional 事务手动回滚及提交后操作

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

作者: 任未然 | 来源:发表于2020-04-22 14:37 被阅读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() {
                    // 事务提交后操作
                }
            });
        }
        
    }
    

    相关文章

      网友评论

        本文标题:@Transactional 事务手动回滚及提交后操作

        本文链接:https://www.haomeiwen.com/subject/xcsiihtx.html