Spring 框架的事务处理







Spring 框架的事务处理

Spring框架的核心:

  1. IOC 技术 【必需】,它的目的是对象的自动注入
  2. AOP 【可选】, 它的目的是代码增强

注:Spring框架的事务管理是基于AOP机制,它支持两种:

  1. 编程式事务操作 【使用不多,因为它是侵入式的】
  2. 申明式事务操作【使用较多,是基于AOP的】


事务的基本概念

什么是事务【transaction]?

通俗来讲,就是一组相关的操作,如果是数据库事务,就是一组相关的SQL操作,它们要么一起成功,要么一起失败。



事务的特性[ACID]

  1. 原子性, Atomic, 指的是事务不可分割性
  2. 一致性,Consistency, 当事务结束后,内存数据与底层数据是完全一致的。
  3. 隔离性,Isolation,多个事务之间是互相隔离的。
  4. 持久层,Durability, 当事务正确提交后,数据永不丢失。

如果是数据库事务的话,则目前所有主流的数据库产品都是支持事务的,也就是说,它们都遵守以上4个特性。

注:Spring框架并不是直接与底层的数据库产品直接操作事务,而是提供一个“事务抽象层”,它叫 事务管理平台,它自己定义了多个事务的属性,可以由程序员来控制。



Spring 框架 事务平台

  • TransactionDefinition 接口,此接口是Spring框架对事务属性的定义,从如下几个不同的角度来定义事务属性:

①事务的传播性 [Propagation]

  • PROPAGATION_MANDATORY 强制要加入事务,如果没有事务,则抛出异常
  • PROPAGATION_NESTED 如果已有事务,则加入嵌套事务之中,没有的话,则创建新的事务
  • PROPAGATION_NEVER 不支持当前事务,如果有事务,则抛出异常
  • PROPAGATION_NOT_SUPPORTED 不支持当前事务,始终以非事务方式执行
  • PROPAGATION_REQUIRED 如果已有事务,则支持当事务,没有的话,则创建新的事务
  • PROPAGATION_REQUIRES_NEW 如果已有事务,则挂起当前事务,并开启新事务,如果没有,直接开启新事务
  • PROPAGATION_SUPPORTS 如果已有事务,则支持当前事务,如果没有,则以非事务方式执行。

②事务的隔离性 [isolation]

  • ISOLATION_DEFAULT 采用底层数据存储的默认事务隔务级别
  • ISOLATION_READ_UNCOMMITED 表示允许脏读、不可重复性、幻读 的隔离级别
  • ISOLATION_READ_COMMITED 表示不允许脏读,但是存在不可重复性、幻读 的隔离级别
  • ISOLATION_REPEATABLE_READ 表示不允许脏读和不可重复读,但是允许幻读 的隔离级别
  • ISOLATION_SERIALIZABLE 表示不允许脏读和不可重复读以及幻读 的隔离级别
  • 什么叫脏读[Dirty Read], 表示一个事务可以读取到另一个事务没有提交的数据。

  • 什么叫不可重复读[non repeatable read], 表示在同一个事务中,执行相同的SQL语句,两次读到的 列值内容不一样。

  • 什么叫幻读[phantom], 是一种特列的不可重复读,表示在同一个事务中,执行相同的SQL语句,两次读到的行数量不一样。

    注: 事务的隔离级别越高,并发的性能就越低。
    

③事务的只读性

  	 isReadOnly   表示事务是否是只读的。

④事务的超时性

     Timeout  表示事务在指定的时间内拿不到锁,就抛出事务超时异常

⑤事务的回滚性

     rollback  指定回滚的操作

PlatformTransactionManager 接口

平台事务管理器接口,是Spring框架为统一事务处理抽象出来的一个独立平台的事务管理器,它有不同的实现:

TransactionStatus 接口

用来记录事务的状态的,里面有判断事务状态、事务保存点的方法,以及设置成只读事务的操作方法

SavepointManager 接口

事务保存点管理器接口,它提供了创建事务保存点、删除事务保存点以及回调到事务保存点的操作

注:以上每一个接口,Spring框架都提供了内置的实现。

Spring 事务管理图

Spring 事务管理图


Spring 申明式事务的使用

前提:

  1. 要开启AOP:
    在 AppConfig 配置类中,使用 @EnableTransactionManagement 来开启事务处理
  1. 导入相关的依赖:
    导入 spring-jdbc 的依赖即可,它会间接依赖 spring-tx 依赖


开发步骤

  1. 准备一个 maven 项目
  2. 在 AppConfig.java 中,使用 @EnableTransactionManagement 来开启事务处理, 并且要指定使用哪个具体的事务管理器,此处我们选择 DataSourceTransactionManager
  3. 在需要添加事务的类型上或者方法上,打上 @Transactional 注解即可



Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中

© 2020 09 - Guyu.com | 【版权所有 侵权必究】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值