【笔记】Spring的事务是如何回滚的/Spring的事务管理是如何实现的

2023-12-26 12:53:17

Spring的事务是如何回滚的/Spring的事务管理是如何实现的

数据库(Spring事务)
1、建立连接、开启事务(准备工作)
2、进行sql操作(业务逻辑)
3、执行成功,则commit;
执行失败,则rollback
在这里插入图片描述
总:Spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInteceptor来实现的,然后调用invoke来实现具体的逻辑
分:1、先做准备工作,解析各个方法上事务相关的属性(隔离性、传播特性),根据具体的属性来判断是否开启新事物
2、当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务
3、执行具体的sql逻辑操作
4、在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack来实现的,实现的时候也要获取连接对象,通过连接对象来回滚

protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {
    // 判断当前是否存在事务
    if (txInfo != null && txInfo.hasTransaction()) {
        if (logger.isTraceEnabled()) {
            logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() +
                "] after exception: " + ex);
        }
        // 判断是否满足回滚条件
        if (txInfo.transactionAttribute.rollbackOn(ex)) {
            try {
                // 回滚处理
                txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
            }
            // 其余代码
        }
        else {
            try {
                // 如果不满足回滚条件出现异常也会继续提交
                txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
            }
            // 其余代码
        }
    }
}
    回滚操作,获取当前线程的数据库连接并调用其rollback方法进行回滚,使用的是底层数据库protected void doRollback(DefaultTransactionStatus status) {
    DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
    // 获取数据库连接
    Connection con = txObject.getConnectionHolder().getConnection();
    if (status.isDebug()) {
        logger.debug("Rolling back JDBC transaction on Connection [" + con + "]");
    }
    try {
        // 调用数据库的回滚
        con.rollback();
    }
    catch (SQLException ex) {
        throw new TransactionSystemException("Could not roll back JDBC transaction", ex);
    }
}

5、如果执行过程中,没有任何意外情况的发生,那么通过completeTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是要获取链接,通过连接对象来提交
6、当事务执行完毕之后需要清除相关的事务信息cleanupTransactionInfo

文章来源:https://blog.csdn.net/weixin_43914278/article/details/135213637
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。