事务概念:

小明有100块钱去买书,买书的过程是先扣钱还是背包表加上一本书?
方案一:先扣钱再加书
方案二:先加书在扣钱   
无论方案一还是方案二都是两步操作必有一先一后。如果我们的Java代码执行第一步的时候没问题,第二步报错导致方法没有执行。
方案一结果钱没了,书也没了。  方案二结果书有了,钱没扣。
Spring框架帮我们整合了数据库的事务。通常我们直接使用@Transactional注解。但是如果业务复杂即便我们加了@Transactional注解通常也会失效。所以下面的伪代码提供了事务回滚的安全方案。
   
    /**
     1.添加事务注解   指定了一旦发生Exception.class的异常就会触发回滚 
     如果异常被catch到,如果不再抛出异常,则回滚无效。
     往往在catch代码块再次抛出异常(一般是业务定义的异常,
     如果嫌麻烦可直接throw new RuntimeException("抛出xxx异常"); ),
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void abc() {
        try {
            // 2.执行业务  这里无论发生多少异常一旦被catch住,Spring事务将不会执行回滚,所以一般在catch代码块里再次抛异常。
        } catch (Exception e) {
            // 3.记录日志,手动再抛异常
            System.out.println("记录下异常信息");
            throw new RuntimeException("抛出xxx异常");
        }
    }
// 在Spring事务操作过程中,后置通知执行前强制执行回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    /**
     1.添加事务注解   指定了一旦发生Exception.class的异常就会触发回滚
     如果异常被catch到,如果不再抛出异常,则回滚无效。
     往往在catch代码块再次抛出异常(一般是业务定义的异常,
     如果嫌麻烦可直接throw new RuntimeException("抛出xxx异常"); ),
     */
    @Transactional(rollbackFor = ClassNotFoundException.class)
    @Override
    public void abc() {
        try {
            // 2.执行业务  这里无论发生多少异常一旦被catch住,Spring事务将不会执行回滚,所以一般在catch代码块里再次抛异常。
        } catch (Exception e) {
            // 在Spring事务操作过程中,后置通知执行前强制执行回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            // 3.记录日志,手动再抛异常
            System.out.println("记录下异常信息");
          //  throw new NullPointerException("抛出xxx异常");
        }
    }

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注