Spring事务在实际项目开发中的使用(2)

public CommonException(CommonErrorCode error) {
        super(error.getDesc());
        this.error = error;
        this.errMsg = error.getDesc();
        this.detailMsg = error.getDesc();
    }

public CommonException(CommonErrorCode error, String errMsg) {
        super(errMsg);
        this.error = error;
        this.errMsg = errMsg;
        this.detailMsg = errMsg;
    }

public CommonException(CommonErrorCode error, String errMsg, String detailMsg) {
        super(StringUtils.isEmpty(detailMsg) ? errMsg : detailMsg);
        this.error = error;
        this.errMsg = errMsg;
        this.detailMsg = detailMsg;
    }

public CommonException(CommonErrorCode error, String errMsg, Throwable cause) {
        super(errMsg, cause);
        this.error = error;
        this.errMsg = errMsg;
        this.detailMsg = errMsg;
    }

public CommonException(CommonErrorCode error, String errMsg, String detailMsg, Throwable cause) {
        super(StringUtils.isEmpty(detailMsg) ? errMsg : detailMsg, cause);
        this.error = error;
        this.errMsg = errMsg;
        this.detailMsg = detailMsg;
    }

public CommonException(CommonErrorCode error, Throwable cause) {
        super(error.getDesc(), cause);
        this.error = error;
        this.errMsg = error.getDesc();
        this.detailMsg = error.getDesc();
    }

public String getErrMsg() {
        return errMsg;
    }

public CommonErrorCode getError() {
        return error;
    }

public String getDetailMsg() {
        return detailMsg;
    }

public void setDetailMsg(String detailMsg) {
        this.detailMsg = detailMsg;
    }

public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

public Object getData() {
        return data;
    }

public CommonException setData(Object data) {
        this.data = data;
        return this;
    }
}

4,事务方法调用事务方法,怎么去处理

首先我们先确认一个前提:事务的传播行为我们使用默认的即:required,并且我们假设有两个事务方法a,b;a调用b。

(1)根据上面我们讲过的required的特性,我们知道spring对于这种事务方法间的调用,会默认把它当做一个事务;我们假设如果b中抛出了NullpointException,并且a,b都没有做异常的处理,那么由a,b组成的整个事务肯定都会进行回滚,这是毋庸置疑的。

(2)如果b出现异常,a catch了异常,并且没有抛出去,就像我们上面例子讲的只是记录了日志,我们会发现这个异常,思考一下为什么呢?

Spring事务在实际项目开发中的使用

我们知道spring 事务管理,启用事务的方法,调用另一个事务方法时,会进行事务传播。注解@Transactional默认的传播机制是PROPAGATION_REQUIRED。再来回顾一下required特性:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

所以是补齐方法运行的时候,同步的事务合并到了补齐的事务里面。当同步发票发生异常后,被try catch 捕获,没有抛出来。但是事务还是会进行回滚,回滚执行到 DataSourceTransactionManager 类的 doSetRollbackOnly 方法时,设置了rollbackOnly = true;

Spring事务在实际项目开发中的使用

由于异常被catch, 不阻断整个事务执行。整个事务执行完后,执行commit 提交,我们打开这个抽象类AbstractPlatformTransactionManager看一下commit的逻辑

Spring事务在实际项目开发中的使用

这里我标红了这个方法,我们继续往下看,我们打开DefaultTransactionStatus这个类,可以看到标红方法的具体实现。

Spring事务在实际项目开发中的使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/229dffe5ab9ce6ffb0123acecbcb8b68.html