spring 事务

事务执行原理

入口是invokeWithinTransaction,能走到这一步,说明已经在代理类那里经过过滤,方法头上使用了Transaction注解。

首先取到注解上的参数,保存到TransactionAttribute的子类中,之后,取到TransactionManager;

调用createTransactionIfNecessary方法,基于前面解析出来的Transaction注解配置参数判断是否需要创建事务,如需要则创建,默认事务的名称是当前执行方法的名称。

首先调用doGetTransaction方法获取当前存在的事务信息,这里是基于当前的datasource从threadlocal对象resources中获取当前的conn,之后封装成DataSourceTransactionObject对象返回,除了嵌套调用的事务,一般这里取到的都是null。

之后判断是否有取到connection对象,根据是否有事务决定下一步策略,这里的策略是由当前的事务传播机制确定的。

  • 之前已经存在了事务 进入handleExistingTransaction方法处理 判断传播机制
  • PROPAGATION_NEVER(不允许当前线程存在事务) 直接报错
  • PROPAGATION_NOT_SUPPORTED(当前方法中不支持事务) 因为当前方法不需要事务,所以直接把前面的事务挂起,之后保存当前的事务状态,事务对象为null
  • PROPAGATION_REQUIRES_NEW 挂起之前的事务 开启新的事务
  • PROPAGATION_NESTED(父子事务) 这里有一个概念是savepoint,如果这里创建的事务要回滚,则回滚到这个savepoint
  • 之前不存在事务 判断传播机制
  • PROPAGATION_MANDATORY 直接报错,因为这个传播机制要求当前一定要有事务存在
  • PROPAGATION_REQUIRED(默认传播机制,要求存在事务,如没有则新建,有的话则不用关心)
  • PROPAGATION_REQUIRES_NEW(要求必须创建一个新的事务)
  • PROPAGATION_NESTED(要求创建父子事务) 以上三种情况下,都会去调用startTransaction创建一个新的事务。 首先在使用suspend方法初始化当前的事务信息,这里suspend方法的作用是,如果有传入事务对象,则挂起之前的事务,并设置到当前事务信息中,同时初始化当前的事务信息,这里调用suspend是用的初始化当前事务信息的功能。 之后doBegin方法中基于构建好的definition初始化事务对象:
    1. 创建数据库连接对象,并设置连接对象的readonly属性以及事务的隔离级别
    2. 将conn对象的AutoCommit属性设置为false
    3. 将第一步创建好的conn对象绑定到前面的threadlocal中,方便后面获取

      *这里有一点,在mybatis执行sql操作的时候,首先就是从这里取conn,如果有,并且SynchronizedWithTransaction为true,则使用。

到这一步就已经基于不同的情况取到了当前的事务对象,下一步要做的是把当前的事务信息绑定到threadlocal对象中,方便后面获取。

之后做的是如果捕捉到了异常,就处理事务回滚。

所有事情都处理完之后,在finally块中清除当前线程中的事务信息。

最后提交当前事务。

Original: https://www.cnblogs.com/guoweishi/p/16566726.html
Author: sunnysgw
Title: spring 事务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592304/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java异常机制

    什么是异常 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对;你要读取数据库的…

    Java 2023年6月5日
    079
  • springboot: mchange-commons-java-0.2.11.jar (系统找不到指定的文件)

    Springboot框架,引入C3P0,启动出现Bug The Class-Path manifest attribute in D:\develop\maven\reposito…

    Java 2023年5月29日
    055
  • 分布式锁

    分布式锁 本文整理自黑马程序员相关资料 问题的引入 在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器…

    Java 2023年6月8日
    063
  • .NET 7 SDK 开始 支持构建容器化应用程序

    微软于 8 月 25 日在.NET官方博客上,.NET 7 SDK 将包括对创建容器化应用程序的支持,作为构建发布过程的一部分,从而绕过需要。显式 Docker 构建阶段。 这一决…

    Java 2023年6月5日
    093
  • MySQL-InnoDB-MVCC多版本并发控制

    一、MySQL可重复读级别下,因为MVCC引起的BUG,下图1为相应的Java代码,其中事务1的生命周期最长,循环开启的事务2、3、4。。。与事务1并行 ,数据的读取只会成功一次,…

    Java 2023年6月16日
    045
  • java 实现逻辑分页

    //逻辑分页PageModel model = new PageModel();long total = list.size();model.setTotal(total);mod…

    Java 2023年6月16日
    097
  • python 反序列化

    Python-反序列化函数使用 pickle.dump(obj, file) : 将对象序列化后保存到文件 pickle.load(file) : 读取文件, 将文件中的序列化内容…

    Java 2023年6月6日
    069
  • KMP算法,看这篇就够了!

    普通的模式匹配算法(BF算法) 子串的定位操作通常称为模式匹配算法 假设有一个需求,需要我们从串”a b a b c a b c a c b a b”中,寻…

    Java 2023年6月9日
    082
  • [javaweb]过滤器处理乱码

    过滤器 有一些信息不应该被处理,要被过滤的。 1.导包 javax.servlet.jsp.jstl jstl-api 1.2 taglibs standard 1.1.2 jav…

    Java 2023年6月6日
    083
  • Java开发笔记(一百五十)C3P0连接池的用法

    JDBC既制定统一标准兼容了多种数据库,又利用预报告堵上了SQL注入漏洞,照理说已经很完善了,可是人算不如天算,它在性能方面不尽如人意。问题出在数据库连接的管理上,按照正常流程,每…

    Java 2023年6月6日
    054
  • 浅谈JAVARMI

    浅谈JAVA-RMI serverdemo: package com.ray.rmi; import java.rmi.Naming; import java.rmi.Remote…

    Java 2023年6月6日
    054
  • Nginx 负载均衡配置

    现有三台服务器 10.160.51.16 10.160.51.54 10.160.51.55 16配置nginx , 请求转发到其余两台 修改默认配置如下: cd /etc/ngi…

    Java 2023年5月30日
    066
  • Java中方法的定义和使用

    方法的定义和使用 注意事项: 1.方法与方法之间是 平级关系 不可以嵌套定义 2.方法的位置 可以在类{}中任意位置 3.方法定义之后 之后被调用 才能被执行 4.return 关…

    Java 2023年6月8日
    061
  • Explicitly configure spring.jpa.open-in-view to disable this warning

    由ReentrantLock和JPA(spring.jpa.open-in-view)导致的死锁问题原因分析。 问题 在压测过程中,发现服务经过一段时间压测之后出现无响应,且无法自…

    Java 2023年5月29日
    076
  • 多线程基础知识!!!

    1.1、继承Thread类(重点) public class MyThread extends Thread{ @Override public void run() { } pu…

    Java 2023年6月8日
    080
  • 一个终端工具竟然有AI功能?使用了1天我立马把其他终端全卸载了!太香了!

    前言 平常工作需要频繁使用终端工具,有一个好的命令行终端工具是非常重要的。 尤其是使用mac的小伙伴,估计不少人都觉得iterm2才是最好的终端工具。 其实起初我也是这么觉得的,但…

    Java 2023年6月8日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球