美文网首页
事务相关的问题总结

事务相关的问题总结

作者: 紫雨杰 | 来源:发表于2018-06-11 11:21 被阅读0次

一、事务回滚问题

 1、查看源码发现,事务默认是只回滚运行时异常,如果没有配置,则对非运行时异常不会回滚

     例如: @Transactional注解后面配置了rollbackFor = Throwable.class,则对所有异常都会回滚
            如果没有配置,则不会回滚非运行时异常

     @Transactional(rollbackFor = Throwable.class)
     public void save(User user, boolean flag) throws Exception {
            userMapper.insertSelective(user);
            if (flag) {
                throw new Exception();
            }
      }

二、事务失效问题

     1、Spring中一个没有事务的方法调用一个有事务的方法,会导致事务失效,

     2、原因是代理对象只会作用于目标对象调用的那个方法,不会作用于其它方法

     3、如果springmvc配置了全扫描包,也会导致事务失效。

三、事务失效的解决办法

方式一:自己手动创建事务,提交事务,回滚事务(Springboot中测试)

@Service
public class UserService {

    @Autowired
    protected UserMapper userMapper;

    @Autowired
    private DataSourceTransactionManager transactionManager;

    public void test(User user, boolean flag) throws Exception {
       save(user, flag);
    }

    public void save(User user, boolean flag) {
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus transaction = transactionManager.getTransaction(definition);
        try {
            userMapper.insertSelective(user);
            if (flag) {
                throw new Exception();
            }
            transactionManager.commit(transaction);
        } catch (Exception e) {
            transactionManager.rollback(transaction);
        }
    }
}

方式二:获取代理类对象,使用代理类对象调用带有事务的方法(Springboot中测试)

@Service
public class UserService {

    @Autowired
    protected UserMapper userMapper;

    @Autowired
    private ApplicationContext applicationContext;

    public void test(User user, boolean flag) throws Exception {
        //获取代理类对象
        UserService bean = applicationContext.getBean(UserService.class);
        //由代理类对象调用带有事务的方法
        bean.save(user, flag);
    }

    @Transactional(rollbackFor = Throwable.class)
    public void save(User user, boolean flag) {
        try {
            userMapper.insertSelective(user);
            if (flag) {
                throw new Exception();
            }
        } catch (Exception e) {
            //捕获异常,获取当前事务的状态,然后手动回滚,如果没有事务,则会抛出异常
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
}

相关文章

  • 事务相关的问题总结

    一、事务回滚问题 二、事务失效问题 三、事务失效的解决办法 方式一:自己手动创建事务,提交事务,回滚事务(Spri...

  • 一个@Transaction哪里来这么多坑?

    目录前言事务失效  数据库层面  业务代码层面  总结事务回滚相关问题读写分离跟事务结合使用时的问题总结 前言 在...

  • spring 声明式事务管理

    本节阐述在事务相关的问题上,Spring框架的声明式事务管理的内部工作原理。 关于Spring框架的声明式事务支持...

  • 分布式事务相关问题

    分布式事务没有标准答案,只有结合业务场景的解决方案 TCC,XA,JTA,LCN,2PC 1、分布式事务是什么 ...

  • 分布式事务总结

    结合多篇文章和实践,总结一下分布式事务相关的内容。 分布式事务是什么 百度百科的说法 分布式事务是指事务的参与者、...

  • MySQL重要知识点(总结)

    最近一段时间都学习mysql,将重要的知识点总结如下: 一、字段、表、索引设计规范相关 二、事务相关 三、锁相关 ...

  • 事务相关

    http://www.zsythink.net/archives/1233

  • 事务相关

    事务四大特征(ACID): 原子性 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生要么都不发生。 ...

  • Postgresql 事务总结

    Postgresql 事务总结 五种并发问题 丢失更新: 一个事务覆盖另一个事务已提交的更新数据. dirty r...

  • RunLoop -- 相关问题的总结

    1、RunLoop在实际场景的应用 RunLoop -- 在实际开发中的应用 2、RunLoop内部实现逻辑 Ru...

网友评论

      本文标题:事务相关的问题总结

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