首页 > 其他分享 >spring中事务的原理

spring中事务的原理

时间:2023-04-10 17:56:19浏览次数:28  
标签:事务 spring Transactional user 失效 原理 public

背景

spring在使用事务的时候会出现事务失效的情况。这里了解spring中事务原理,以及事务失效的原理和解决方案。

原因

spring中事务是基于AOP的,如果不是代理对象执行的话就不会有事务。

比如,加上 @Transactional 的事务方法,是被包裹起来的。

public class UserServiceProxy extends UserService {

	UserService target;

	public void test() {
		// 切面逻辑 spring transaction
		// 有 @Transactional 则开启事务

		target.test();

		// 1. 事务管理器新建一个数据库连接 conn
		// 2. 数据库连接的 autocommit 设置位 false conn.autocommit = false;
		// jdbcTemplate 会获取到前面建立的数据库连接
		// 执行SQL
		// 调用连接到 commit 方法提交事务 conn.commit();
		// 如果失败,就调用连接的 rollback 进行回滚

	}


}
    @Transactional  
   public void testTransactionManager() {  
      jdbcTemplate.execute("INSERT INTO `demo_db`.`x_sys_tb_user`(`user_id`, `user_name`) VALUES ('1', '1');");  
      subA();  
   }  
  
   // propagation 传播  
   // 设置传播类型  
   @Transactional(propagation = Propagation.NEVER)  
   public void subA() {  
      jdbcTemplate.execute("INSERT INTO `demo_db`.`x_sys_tb_user`(`user_id`, `user_name`) VALUES ('2', '2');");  
   }

在执行 testTransactionManager() 的时候 ,subA();是 target即普通对象执行的。

事务生效解决办法

  1. 拆分,把失效的事务拆分出去。新建一个对象把失效的事务方法放到这个对象中,然后注入这对象,
  2. 自己注入自己(注:在 spring 中也算是循环依赖,但是 spring 帮我们解决了)
  3. AopContext.currentProxy() 获取当前的代理对象,然后用代理对象调用失效的事务(注:这种方法可能可读性差一点)

标签:事务,spring,Transactional,user,失效,原理,public
From: https://www.cnblogs.com/xiaosiyuan88888888/p/17303741.html

相关文章

  • SpringMVC怎么实现web端上传超大文件
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务......
  • 13-springcloud-eureka-9-Eureka集群注册中心打包发布
    在实际项目中,需要将Eureka发布到具体服务器上进行部署,打包部署其实和SpringBoot里面的一样,我们可以把其达成jar包,启动时对于properties文件,不同的环境激活不同的配置文件;运行:java-jarspringcloud-service-eureka.jar--spring.profiles.active=eureka8761java-jarspringclo......
  • 详解事务模式和Lua脚本,带你吃透Redis 事务
    摘要:Redis事务包含两种模式:事务模式和Lua脚本。本文分享自华为云社区《一文讲透Redis事务》,作者:勇哥java实战分享。准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。先说结论:Redis的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念......
  • 详解事务模式和Lua脚本,带你吃透Redis 事务
    摘要:Redis事务包含两种模式:事务模式和Lua脚本。本文分享自华为云社区《一文讲透Redis事务》,作者:勇哥java实战分享。准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。先说结论:Redis的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一......
  • 动力节点王鹤SpringBoot3笔记——第六章 远程访问@HttpExchange[SpringBoot 3]
    第六章 远程访问@HttpExchange[SpringBoot3]远程访问是开发的常用技术,一个应用能够访问其他应用的功能。SpringBoot提供了多种远程访问的技术。基于HTTP协议的远程访问是支付最广泛的。SpringBoot3提供了新的HTTP的访问能力,通过接口简化HTTP远程访问,类似Feign功能。Spring......
  • spring注解整合mybatis
    引入依赖<!--mybatis-spring与mybatis使用低版本适配--><!--https://mvnrepository.com/artifact/org.mybatis/mybatis-spring--><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version&......
  • Spring Security系列教程-初识Spring Security
    前言在开始学习SpringSecurity系列教程之前,小千先带大家来了解一下SpringSecurity,看看它到底是什么,有哪些功能,有什么特点,以及它与别的同类框架相比,有什么不同,我们以后学习任何一个新技术,其实都可以遵循"3W1H"法则,这样学习起来才能更有条理。一.SpringSecurity概念首先请各位跟......
  • Mybatis-Plus详解(一篇带入了解底层原理)
    一.MP简介我们知道,Mybatis属于一个半自动的ORM框架。之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文件中编写SQL语句,并没有实现完全的自动化。SQL语句的编写,虽然增加了项目和业务需求实现的灵活性,但对一些基本表的操作而言,无疑增加了数据库操作的......
  • Struts2的运行原理和运行与原理
    运行机制 1、客户端发送请求、通过ActionContextLoader调用FilterDispatcher(struts) 2、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action 3、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 4、ActionProxy......
  • 【Spring MVC】第一个程序
    添加Maven依赖:<!--spring核心类--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency>&......