当前位置:

首页 > 编程开发 > Java Spring 中常见的两种事务类型是什么?

Java Spring 中常见的两种事务类型是什么?

1.Spring中的事务控制方式Spring的事务控制可以分为编程式事务控制和声明式事务控制。编程式开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。声明式开发者采用配置的方式来实现的事务控制,业务代码与事务代码实现解耦合,使用的AOP思想。2.编程式事务控制相关对象2.1PlatformTransactionManagerPlatformTransactionManager接口,是spring的事务管理器接口,里面提供了我们常用的操作事务的方法。2.2TransactionDefinitio

本文目录

      1. Spring中的事务控制方式

      Spring的事务控制可以分为编程式事务控制和声明式事务控制。

      编程式

      开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。

      声明式

      开发者采用配置的方式来实现的事务控制,业务代码与事务代码实现解耦合,使用的AOP思想。

      2.编程式事务控制相关对象

      2.1PlatformTransactionManager

      PlatformTransactionManager接口,是spring的事务管理器接口,里面提供了我们常用的操作事务的方法。

      Java Spring 中常见的两种事务类型是什么?

      Java Spring 中常见的两种事务类型是什么?

      2.2TransactionDefinition

      TransactionDefinition接口提供事务的定义信息(事务隔离级别、事务传播行为等等)

      Java Spring 中常见的两种事务类型是什么?

      (1)事务隔离级别

      设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读(幻读)。

      注意:使用数据库默认级别,如果数据库是mysql,则默认是可重复读,oracle是读已提交。

      ISOLATION_DEFAULT 使用数据库默认级别

      ISOLATION_READ_UNCOMMITTED 读未提交

      ISOLATION_READ_COMMITTED 读已提交(可解决脏读问题)

      ISOLATION_REPEATABLE_READ 可重复读 (可解决脏读、不可重复读)

      ISOLATION_SERIALIZABLE 串行化

      可解决:

      Java Spring 中常见的两种事务类型是什么?

      (2)事务传播行为

      事务传播行为指的就是当一个业务方法【被】另一个业务方法调用时,应该如何进行事务控制。

      Java Spring 中常见的两种事务类型是什么?

      重点:

      Java Spring 中常见的两种事务类型是什么?

      • read-only(是否只读):建议查询时设置为只读

      • timeout(超时时间):默认值是-1,没有超时限制。如果有,以秒为单位进行设置

      2.3 TransactionStatus

      TransactionStatus 接口提供的是事务具体的运行状态。

      Java Spring 中常见的两种事务类型是什么?

      可以简单的理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。

      Spring中的事务控制主要就是通过这三个API实现的

      PlatformTransactionManager 负责事务的管理,它是个接口,其子类负责具体工作

      TransactionDefinition 定义了事务的一些相关参数

      TransactionStatus 代表事务运行的一个实时状态

      理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。

      3.基于XML的声明式事务控制【重点】

      在Spring配置文件中声明式的处理事务来代替代码式的处理事务。底层采用AOP思想来实现。

      声明式事务控制明确事项:

      核心业务代码(目标对象) (切入点是谁?)

      事务增强代码(Spring已提供事务管理器))(通知是谁?)

      切面配置(切面如何配置?)(切面 = 切入点 + 通知)

      3.1快速入门

      使用spring声明式事务控制转账业务。

      步骤:

      1.引入tx命名空间

      2.事务管理器通知配置

      3.事务管理器AOP配置

      4.测试事务控制转账业务代码 

      (1)引入tx命名空间
      
      
      (2)事务管理器通知配置
        
           
      // 通知增强
          
             //定义事务的一些属性 * 表示当前任意名称的方法都走默认配置
           
              
                  
                  //CRUD常用配置
                  
                  
                  
                  
                  
              
          
      (3)事务管理器AOP配置 

      当使用spring声明式管理事务,要使用aop:advisor来进行aop的配置!

      //aop配置:配置切面   
        
              
          -->

      事务参数的配置详解:

      • name:切点方法名称

      • isolation:事务的隔离级别

      • propogation:事务的传播行为

      • timeout:超时时间

      • read-only:是否只读

      4.基于注解的声明式事务控制(重点)

      步骤:

      • 修改service层,增加事务注解

      • 修改spring核心配置文件,开启事务注解支持

      4.1 修改service层,增加事务注解

      @Service
      public class AccountServiceImpl implements AccountService {
        @Autowired
        private AccountDao accountDao;
          @Transactional(propagation = Propagation.REQUIRED, isolation =
      Isolation.REPEATABLE_READ, timeout = -1, readOnly = false)
        @Override
        public void transfer(String outUser, String inUser, Double money) {
          accountDao.out(outUser, money);
          int i = 1 / 0;
          accountDao.in(inUser, money);
       }
      }

      4.2修改spring核心配置文件,开启事务注解支持

      
      
        
        
        
          
        
        
        
      

      4.3纯注解方式

      核心配置类:

      @Configuration  // 声明该类为核心配置类
      @ComponentScan("com.lagou")  // 包扫描
      @Import(DataSourceConfig.class) //导入其他配置类
      @EnableTransactionManagement //事务的注解驱动
      public class SpringConfig {
          @Bean
          public JdbcTemplate getJdbcTemplate(@Autowired DataSource dataSource){
              JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
              return jdbcTemplate;
          }
          @Bean
          public PlatformTransactionManager getPlatformTransactionManager(@Autowired DataSource dataSource){
              DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
              return dataSourceTransactionManager;
          }
      }

      数据源配置类:

      @PropertySource("classpath:jdbc.properties") //引入properties文件
      public class DataSourceConfig {
          @Value("${jdbc.driverClassName}")
          private String driver;
          @Value("${jdbc.url}")
          private String url;
          @Value("${jdbc.username}")
          private String username;
          @Value("${jdbc.password}")
          private String password;
          @Bean //会把当前方法的返回值对象放进IOC容器中
          public DataSource getDataSource(){
              DruidDataSource druidDataSource = new DruidDataSource();
              druidDataSource.setDriverClassName(driver);
              druidDataSource.setUrl(url);
              druidDataSource.setUsername(username);
              druidDataSource.setPassword(password);
              return druidDataSource;
          }
      }
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。