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

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

最近更新

  1. TCP协议是安全的吗?

    2023-12-27 16:04:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-27 16:04:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-27 16:04:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-27 16:04:04       18 阅读

热门阅读

  1. DFS算法查找所有路径详解

    2023-12-27 16:04:04       46 阅读
  2. docker安装mysql和redis

    2023-12-27 16:04:04       34 阅读
  3. GPT在企业自动化方面的应用

    2023-12-27 16:04:04       46 阅读
  4. 【Python】Ubuntu 设置默认Python

    2023-12-27 16:04:04       45 阅读
  5. ClickHouse中创建用户、数据库并进行权限分配

    2023-12-27 16:04:04       48 阅读
  6. LeetCode-23 合并 K 个升序链表

    2023-12-27 16:04:04       42 阅读
  7. SQL面试题挑战08:补全缺失日的月销售累计

    2023-12-27 16:04:04       41 阅读