Spring框架的事务处理-spring框架入门到精通

简介: 事务是逻辑上的一组操作,要么都执行,要么都不执行。我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。

1.什么是事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。

搭配视频教程学习:https://www.bilibili.com/video/BV1nz4y1d7uy

public void savePerson() { 
 personDao.save(person);
 personDetailDao.save(personDetail);
 }
AI 代码解读

另外,需要格外注意的是:事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为 myisam,那么程序也就不再支持事务了!

2.在什么时候想到使用事务

当我们的操作涉及到多个表,或者是多个sql语句的增加insert删除delete修改update的时候,需要保证这些语句都是成功才能完成我们的功能;或者保证这些语句都失败,保证操作是符合要求的。最明了的例子就是转账,从A账户转到B账户中,要保证从A中扣除的金额一定要加到B里去。如果A到B转账成功,那么A扣B加,要保证A和B的账户是均衡的。如果A向B转账的过程中扣款失败了,那就应该把操作都回退,A也不扣,B也不加,保证A和B中账户数据的平衡。

在java代码中写程序,控制事务,此时事务应该放在哪里呢?

在开发中,事务是放在serviceImpl类的业务方法上的,因为一个业务方法可能涉及到多个dao的调用,执行多个sql语句。

3.使用JDBC访问数据库,还是Mybatis访问数据库怎么处理事务

JDBC访问数据库,处理事务:连接对象Connection conn;事务提交 conn.commit ();事务回滚:conn.rollback ();

Mybatis 访问数据库,处理事务:事务提交:SqlSession.commit ();事务回滚:SqlSession.rollback ();

4. 问题3中事务的处理方式有什么不足

(1)不同的数据库访问技术,处理事务的对象,方法不同。JDBC使用的是Connection对象,Mybatis访问对象使用的事SqlSession。方法不同就需要了解不同数据库访问技术使用事务的原理。

(2)掌握多种数据库中事务的处理逻辑,知道什么时候提交,什么时候回滚。

(3)处理事务的多种方法。

总结:多种数据库的访问技术,有不同的事务处理的机制,对象,方法。

5.怎么解决问题4中的这些不足

spring提供了一种处理事务的统一模型,能使用统一的步骤,方式,完成多种不同数据库访问技术的事务处理。

使用spring的事务处理机制,可以完成MyBatis访问数据库的事务处理。

使用spring的事务处理机制,可以完成Hibernate访问数据库的事务处理
image.png

6.处理事务需要怎么做,做什么

Spring处理事务的模型,使用的步骤都是固定的。我们只需要把事务使用的信息提供给spring就可以了。

(1) 事务内部提交,回滚事务,使用的是事务管理器对象,代替我们完成事务的提交commit()和回滚rollback ()操作。事务管理器是一个接口和他的众多实现类。事务管理器是PlatformTransactionManager接口对象,接口中定义了事务的重要方法:一个是提交commit(),一个是回滚rollback();

这个接口的实现类有很多:spirng把每一种数据库访问技术对应的事务处理类都创建好了。

如果我们使用的是MyBatis访问数据库,那Spring创建好的是DataSourceTansactionManager;

如果我们使用的是Hibernate访问数据库,那Spring创建好的是HibernateTansactionManager。

那我们怎么去用Spring创建好的这些事务处理类呢?

我们需要告诉Spring我们使用的是那种数据库访问技术。

怎么告诉Spring呢?

需要声明数据库访问技术对应的事务管理器的实现类,在spring的配置文件中使用声明就可以了,声明之后spring就知道我们用的是那种数据库访问技术了。

例如,我们要使用MyBatis访问数据库,我们就应该在xml配置文件中声明一个DataSourceTansactionManager的bean对象;

(2)我们的业务方法需要什么样的事务呢?需要提供一下事务的类型。

  • 说明方法需要的事务:

事务的隔离级别:有4个值。在TransactionDefinition中定义了事务描述相关的3类常量:分别是事务隔离级别、事务传播行为以及事务默认超时时限。在事务隔离级别中定义了5个事务隔离级别的常量,这些常量都以ISOLATION_开头,形如ISOLATION_xxx 。

default:采用数据库默认的隔离级别。MySql的默认隔离级别为可重复读(repeatable_read ),Oracle 默认为读已提交(read_commit )。

另外的4个真正有效值:

  1. read _uncommitted:读未提交。未解决任何并发问题。
  2. read _commited:读已提交。解决脏读,存在不可重复读和幻读。
  3. repeatable_read:可重复读。解决脏读和不可重复读,存在幻读。
  4. serializable:串行化,不存在并发问题。
  • 事务的超时时间(timeout),表示一个方法最长的执行时间,如果方法执行时超过了这个时间,事务就回滚。超时时间的单位是s,默认是-1,代表没有超时时间。

事务的传播行为:控制业务方法是不是有事务的,是什么样的事务的。

  • 事务的传播行为一共有7个(propagation_xxx):表示我们的业务方法在调用时,事务在方法之间是如何使用的。通过传播行为,我们能控制这个方法到底有没有事务,有什么样的事务。

propagation _required :指定的方法必须有事务。若存在事务,就加入到当前事务中,若没有事务就创建一个新事务。是spring中最常见的事务传播行为,也是默认的事务传播行为。

举例:

如果传播行为加在doOther()方法上。doSome()方法内调用doOther()方法。如果doSome()方法在调用doOther()方法时就是在事务内运行的,那么doOther()方法的执行也加入到已存在的该事务内执行。如果doSome()方法在调用doOther()方法时没有在事务内执行,那么doOther()方法会自己创建一个事务,并在这个新创建的事务中执行。

propagation _requires new :新事务。方法在执行时一定是新建一个事务,不用别人提供的事务。如果当前已经存在事务,就将当前事务挂起,知道新事务执行完毕。

propagation _supports :指定的方法支持当前事务,但是如果当前没有事务,也可以执行。就是说,有事务也可以,没事务也行。

propagation_mandatory 、propagation _nested 、propagation _never 、propagation _not _supported 。

(3)提交事务、回滚事务的时机

  • 当业务方法执行成功,没有异常抛出,当方法执行完毕,Spring在方法执行后提交事务。事务管理器commit
  • 当你的业务方法抛出运行时异常或者error,Spring执行回滚,调用事务管理器的rollback运行时异常的定义:RuntimeException和他的子类都是运行时异常,例如NullPointException、NumberFormatException
  • 当你的业务方法抛出非运行时异常,主要是受查异常时,提交事务。受查异常的定义:在你写代码时,必须处理的异常,例如IOException和SQLException。

总结Spring的事务:

  1. 管理事务的是事务管理器及其实现类。
  2. Spring的事务是一个统一管理模型:
  • 指定要使用的事务管理器的实现类,使用xml配置文件中的标签
  • 指定哪些类,哪些方法需要加入事务的功能
  • 指定方法需要的隔离级别,传播行为和超时时间

我们需要告诉Spring我们的项目中类信息,方法的名称,方法的事务传播行为。

相关文章
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
34 0
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
98 21
Spring框架初识
|
3天前
|
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
30 0
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
40 5
|
5月前
|
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
218 0
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
171 29
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等