Spring的事务管理

这篇具有很好参考价值的文章主要介绍了Spring的事务管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring的事务管理

1、事务的回顾

【1】事务的定义

是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合

【2】事务的ACID原则

事务具有4个基本特性:原子性、一致性、隔离性、持久性。也就是我们常说的ACID原则

  • 原子性(Atomicity):
    一个事务已经是一个不可再分割的工作单位。事务中的全部操作要么都做;要么都不做

    例如:A和B两个人一共1000元,A给B转账100元,A付款100元,B收款100元,
    	 A的付款行为和B的收款行为要么都成功,要么都失败
    
  • 一致性(Consistency):
    事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

    例如:A和B两个人一共1000元,无论A,B两人互相转账多少次,A和B两个人总额都应该是1000元
    
  • 隔离性(Isolation):
    事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性 和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

例如:万达影院有《叶问4》电影票100张,允许所有人同时去淘票票上购票,当第100张电影票被A,B,C3人同时购买,如果A拿到第100张电影票,但是还在犹豫要不要付钱,则B,C必须等待A的决定,如果A决定付钱,B.C就无法抢到票,如果A超时不付钱,则这第100张电影票回归票池,从新分配。

  • 持久性(Durability):
    一个事务一旦提交,它对数据库中数据的改变会永久存储起来。其他操作不会对它产生影响

    例如:万达影院有《叶问4》电影票100张,100张电影票销售完毕,对于每个购买者来说,他的购买记录已经产生,即使退票,他之前的购买记录也不会消失。
    

2、spring事务API介绍【了解】

【1】PlatformTransactionManager
【1.1】PlatformTransactionManager作用

​ PlatformTransactionManager【事务平台管理器】:是一个接口,定义了获取事务、提交事务、回滚事务的接口

【1.2】PlatformTransactionManager接口
public interface PlatformTransactionManager {
 
    //根据事务定义TransactionDefinition,获取事务
    TransactionStatus getTransaction(TransactionDefinition definition);
    //提交事务
    void commit(TransactionStatus status);
    //回滚事务
    void rollback(TransactionStatus status);

}
【1.3】PlatformTransactionManager实现类

事务平台管理器PlatformTransactionManager定义了标准,他有如下经常使用的实现

PlatformTransactionManager的实现类 说明
org.springframework.jdbc.datasource.DataSourceTransactionManager DataSource 数据源的事务
org.springframework.orm.hibernateX.HibernateTransactionManager Hibernate 事务管理器。
org.springframework.orm.jpa.JpaTransactionManager JPA 事务管理器
org.springframework.transaction.jta.JtaTransactionManager 多个数据源的全局事务管理器
org.springframework.orm.jdo.JdoTransactionManager JDO 事务管理器
【2】TransactionDefinition
【2.1】TransactionDefinition作用

TransactionDefinition【事务定义信息】:是一个接口,定义了事务隔离级别、事务传播行为、事务超时时间、事务是否只读

【2.2】TransactionDefinition接口
public interface TransactionDefinition {
    /**********************事务传播行为类型常量***********************************/
   //事务传播行为类型:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
    int PROPAGATION_REQUIRED = 0;
    //事务传播行为类型:支持当前事务,如果当前没有事务,就以非事务方式执行。 
    int PROPAGATION_SUPPORTS = 1;
    //事务传播行为类型:当前如果有事务,Spring就会使用该事务;否则会抛出异常
    int PROPAGATION_MANDATORY = 2;
    //事务传播行为类型:新建事务,如果当前存在事务,把当前事务挂起。 
    int PROPAGATION_REQUIRES_NEW = 3;
    //事务传播行为类型:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
    int PROPAGATION_NOT_SUPPORTED = 4;
    //事务传播行为类型:即使当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
    int PROPAGATION_NEVER = 5;
    //事务传播行为类型:如果当前存在事务,则在嵌套事务内执行。
    int PROPAGATION_NESTED = 6;

     /**********************事务隔离级别常量***********************************/
    //MySQL默认采用ISOLATION_REPEATABLE_READ,Oracle采用READ__COMMITTED级别。)
    //隔离级别:默认的隔离级别()
    int ISOLATION_DEFAULT = -1;
    //隔离级别:读未提交(最低)
    int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
    //隔离级别:读提交
    int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
    //隔离级别:可重复度
    int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
    //隔离级别:序列化操作(最高)
    int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

    //默认事务的超时时间
    int TIMEOUT_DEFAULT = -1;

    //获取事务的传播行为
    int getPropagationBehavior();
    
    //获取事务的隔离级别
    int getIsolationLevel();
    
    //获取超时时间
    int getTimeout();
    
    //是否只读
    boolean isReadOnly();
    
    //事务名称
    String getName();
}
【2.3】事务隔离级别
【2.3.1】为什么要事务隔离?

如果没有定义事务隔离级别:

  • 脏读

​ 在一个事务中读取到了另外一个事务修改的【未提交的数据】,而导致多次读取同一个数据返回的结果不一致 (必须要解决的)

例如:
    1.事务1,小明的原工资为1000, 财务人员将小明的工资改为了8000【但未提交事务】
    2.事务2,小明读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
    3.事务1,财务发现操作有误,回滚了操作,小明的工资又变为了1000
      像这样,小明读取的工资数8000是一个脏数据
  • 不可重复读

​ 在一个事务中读取到了另外一个事务修改的【已提交的数据】,而导致多次读取同一个数据返回的结果不一致

例如:
    1.事务1,小明读取了自己的工资为1000,操作还没有完成 
    2.事务2,这时财务人员修改了小明的工资为2000,并提交了事务.
    3.事务1,小明再次读取自己的工资时,工资变为了2000
  • 幻读(虚读):

    ​ 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录

例如:   
   1.事务1,财务统计所有工资为5000的员工有10人。
   2.事务2,人事向user表插入了一条员工记录,工资也为5000
   3.事务1,财务再次读取所有工资为5000的员工 共读取到了11条记录,明明刚刚是10人啊?产生幻觉了?

事务隔离就是帮助我们解决:脏读、不可重复读、幻读(虚读)

【2.3.2】spring事务隔离级别

隔离级别由低到高【读未提交】=>【读已提交】=>【可重复读】=>【序列化操作】

隔离级别 说明 脏读 不可重复读 幻读
ISOLATION_DEFAULT spring默认数据库的隔离级别
ISOLATION_READ_UNCOMMITTED 读未提交
ISOLATION_READ_COMMITTED 读已提交 ×
ISOLATION_REPEATABLE_READ 可重复读 × ×
ISOLATION_SERIALIZABLE 序列化操作 × × ×

对大多数数据库来说就是READ_COMMITTED(读已提交)

MySQL默认采用REPEATABLE_READ(可重复读),

Oracle采用READ__COMMITTED()

Spring的隔离级别默认数据库的隔离级别:ISOLATION_DEFAULT

【2.4】事务传播行为

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

传播行为 说明
REQUIRED 当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改)
SUPPORTS 当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询)
MANDATORY 当前如果有事务,Spring就会使用该事务;否则会抛出异常
REQUIRES_NEW 当前如果有事务,把当前事务挂起,新建事务
NOT_SUPPORTED 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起
NEVER 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
NESTED 当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样

【默认】REQUIRED:当前如果有事务,Spring就会使用该事务;否则会开始一个新事务

3、扩展链接

事务隔离级别中的可重复读能防幻读吗?文章来源地址https://www.toymoban.com/news/detail-414672.html

到了这里,关于Spring的事务管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring 事务管理

    Spring 事务管理

    目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象(Transaction Abstraction) 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1. 高级同步方式 1.3.2. 低级同步方式 1.3.3.TransactionAwareDataSo

    2024年02月13日
    浏览(12)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(9)
  • 【掌握Spring事务管理】深入理解事务传播机制的秘密

    【掌握Spring事务管理】深入理解事务传播机制的秘密

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 1.Spring 中事务的实现方式 1.1 Spring 编程式事务 (了解) 1.2 Spring 声明式事务 ( @Transactional ) 【异常情况一】(自动回滚成功) 【异常情况二】(自动回滚失效

    2024年02月10日
    浏览(12)
  • Spring中的事务管理

    概念 事务 是一组操作的集合,它是一个不可分割的工作单位,这些操作要么 同时成功 ,要么 同时失败 。 操作 开启事务(一组操作 开始前 ,开启事务) : start transaction / begin ; 提交事务(这组操作 全部成功后 ,提交事务) : commit ; 回滚事务(中间任何一个操作 出现异常 ,

    2024年02月12日
    浏览(9)
  • 【Spring教程21】Spring框架实战:Spring事务简介、AOP事务管理、代码示例全面详解

    【Spring教程21】Spring框架实战:Spring事务简介、AOP事务管理、代码示例全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《AOP(面对切面编程)知识总结》 事务作用:在数据层保障一系列的数据库

    2024年02月04日
    浏览(24)
  • Spring 事务管理详解及使用

    Spring 事务管理详解及使用

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SSM 框架从入门到精通 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:一文吃透 Spring 中

    2024年01月20日
    浏览(19)
  • 【Spring篇】AOP事务管理

    【Spring篇】AOP事务管理

    🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 1.Spring事务简介 1.相关概念介绍 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或 业务层 保障一系列的数据库操作同成功同失败 数据层有事务我们可以理解,为什么业务层也需要处理事务

    2024年02月06日
    浏览(10)
  • Spring管理事务知识

    Spring管理事务知识

    目录 1.什么是事务 2.事务的特性ACID 3.Spring 管理事务的方式 4.Spring管理事务的体现:JDBCTemplate 5.声明式事务的属性有哪些 6.声明式事务属性---只读 7.声明式事务属性---超时 8.声明式事务属性---回滚策略 9.声明式事务属性---事务隔离级别 10.声明式事务属性---事务传播行为  概念

    2024年02月11日
    浏览(7)
  • 【spring(四)】Spring事务管理和@Transactional注解

    【spring(四)】Spring事务管理和@Transactional注解

    🌈键盘敲烂,年薪30万🌈 目录 Spring中的事务管理 问题抛出: 解决方案: @Transactional注解: rollbackFor属性: propagation属性: 应用: 📕总结 知识回顾: ❓什么是事务 事务是对数据操作的集合,它是数据操作的最小执行单位,也就是说,要么一个事务中操作全部执行完毕,

    2024年01月17日
    浏览(37)
  • 深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

    深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn

    2024年03月21日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包