Spring事务原理分析-部分一

什么事务

事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败。

事务基本特性

⑴ 原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

如果不考虑隔离性引发安全性问题

读问题
  • 脏读 :一个事务读到另一个事务未提交的数据
  • 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
  • 虚读、幻读 :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
写问题
  • 丢失更新
解决读问题
  • 设置事务的隔离级别

  • Read uncommitted :未提交读,任何读问题解决不了。

  • Read committed :已提交读,解决脏读,但是不可重复读和虚读有可能发生。

  • Repeatable read :重复读,解决脏读和不可重复读,但是虚读有可能发生。

  • Serializable :解决所有读问题。

Spring的事务管理的API

PlatformTransactionManager:平台事务管理器

  • 平台事务管理器:接口,是Spring用于管理事务的真正的对象。

  • DataSourceTransactionManager :底层使用JDBC管理事务

  • HibernateTransactionManager :底层使用Hibernate管理事务

TransactionDefinition :事务定义信息

  • 事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读

TransactionStatus:事务的状态

  • 事务状态:用于记录在事务管理过程中,事务的状态的对象。

事务管理的API的关系:

Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。

Spring的事务的传播行为

Spring的传播行为

  • Spring中提供了七种事务的传播行为:

  • 保证多个操作在同一个事务中

  • PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来

  • PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。

  • PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。

保证多个操作不在同一个事务中

  • PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。

  • PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。

  • PROPAGATION_NEVER :如果A中有事务,报异常。

  • 嵌套式事务

  • PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。

事务控制分类

编程式事务控制

​ 自己手动控制事务,就叫做编程式事务控制。

​ Jdbc代码:

​ Conn.setAutoCommite(false); // 设置手动控制事务

​ Hibernate代码:

​ Session.beginTransaction(); // 开启一个事务

​ 【细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制】

​ (比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)

声明式事务控制

​ Spring提供了对事务的管理, 这个就叫声明式事务管理。

​ Spring提供了对事务控制的实现。用户如果想用Spring的声明式事务管理,只需要在配置文件中配置即可; 不想使用时直接移除配置。这个实现了对事务控制的最大程度的解耦。

​ Spring声明式事务管理,核心实现就是基于Aop。

​ 【粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务。】

​ (因为aop拦截的是方法。)

​ Spring声明式事务管理器类:

​ Jdbc技术:DataSourceTransactionManager

​ Hibernate

技术:HibernateTransactionManager

Spring事务原理分析-部分一相关推荐

  1. Spring事务原理分析(一)--@EnableTransactionManagement 到底做了什么?

    目录 一.概述 二.事务的ACID属性 三.事务的隔离级别 四.事务的传播行为 五.Spring声明式事务环境搭建 六.@EnableTransactionManagement分析 七.AutoPro ...

  2. 【笔记】Spring 事务原理分析和源码剖析

    文章目录 概述 源码解析 xml 配置解析 事务代理类的创建 事务拦截器的实现 切面实现 事务处理实现 总结: 资料 概述 事务处理是一个重要并且涉及范围很广的领域,涉及到并发和数据一致性方面的问题. ...

  3. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  4. Spring事务原理-1-transactionManager以及Connection的本质

    Spring事务原理 1.spring事务配置 2.Connection本质的探究 3. Spring事务的底层原理 1.spring事务配置 <bean id="transactio ...

  5. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  6. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

  7. Spring 事务原理和使用

    转载自  Spring 事务原理和使用 1.Spring@Transactional的配置 步骤一.在Spring配置文件中引入命名空间 <beans xmlns="http://ww ...

  8. MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)

    MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...

  9. Linux服务器开发【有用知识】—MySQL事务原理分析

    前言 今天的目标是学习MySQL事务原理分析,但是却似乎总是非常不顺利,概念和实操实在多到令人发指,故干脆轻松学完一节课,等到时机到了再重新刷一遍吧! 一.事务是什么? 将数据库从一致性状态转化成另一 ...

最新文章

  1. S/4HANA中的销售计划管理
  2. C++ Primer 5th笔记(6)chapter6 函数:函数指针
  3. 【杂谈】当当最新购书优惠来了,满300-60,AI好书推荐
  4. GAN生成对抗网络-PIX2PIXGAN原理与基本实现-图像翻译09
  5. hdu 1261 字串数
  6. Qt - QVariant
  7. python接口自动化代码_python接口自动化(十六)--参数关联接口后传(详解)
  8. 怪兽充电启动招股:2020年业绩下滑五成,小米、高瓴参与认购
  9. matlab 模拟电磁学时域有限差分法,MATLAB模拟的电磁学时域有限差分法
  10. cad动态块制作翻转_CAD中怎么定义旋转动态块?
  11. 百度长期不收录网站怎么办?9个方法解决不收录
  12. simnow账户无法使用,simnow账户修改密码
  13. Winform实现微信功能
  14. android相机网格,Android – 在相机上显示网格线
  15. 马尾神经损伤在中医上叫什么?
  16. 1.微信好友定时发送信息
  17. AE基础教程(13)——第13章 消隐
  18. 如何清理hue元数据库里面的历史数据
  19. 首家印度独资软件公司落户南京
  20. 从雷布斯身上我学到了什么

热门文章

  1. python,一个简单的sqlite 操作类
  2. 1.01.10前端介绍
  3. C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)
  4. 粉色可爱简单404页面代码
  5. debian系统里面 dpkg命令怎么使用
  6. java中怎么传送声音_你的手机是如何实现把声音传送给另一个人的
  7. Q实验室与实验室之间对比对及有效性评价
  8. WIFI时钟在已有硬件基础上的实现
  9. Android Studio经验积累之常见问题以及解决方式
  10. SOSO 金币 免费送QB 会员 笔记本 IPHONE IPAD2