Spring学习之事务管理基础

来源:互联网 发布:淘宝存在隐形降权吗 编辑:程序博客网 时间:2024/05/22 06:43

Spring学习之事务管理基础

数据库事务相关概念

事务的定义

  • 事务,一般指的是数据库事务,是指数据库操作的时候,多个执行语句之间是一个逻辑上的整体,也就是说,这些操作之间要么都执行,要么就都不执行

事务的特性

  • 事务有四大特性:分别是原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabily),简称 ACID
  • 原子性:原子性指的是组成事务的各个操作是一个整体,也就是一个原子单元,不可分割
  • 一致性:一致性指的是事务执行前后,系统的状态应该处于一致的情况,比如说转账事务,转账前后两个账号的金额总和应当保持一致
  • 隔离性:隔离性是指在并发操作数据库的时候,不同的事务之间拥有不同的数据空间,不会被其他事务干扰,根据不同的需要,有不同的隔离级别
  • 持久性:持久性是指一旦事务提交了,那么在逻辑上来说,数据就应当是被持久化了,此时即使发生故障或者其他原因,可以通过日志等其他手段进行恢复
  • 事务的四个特性之间是有着必然的关系的,一致性是最终的目的,原子性、隔离性以及持久性是为了保证一致性而进行的必要条件

没有进行隔离会出现的问题

  • 如果事务的执行过程中没有进行相应的隔离,那么在事务并发操作的时候,会出现读写问题(三类读问题,两类丢失更新问题)
  • 三类读问题
    • 脏读:脏读是指事务A读取到事务B还没有提交的数据,此时如果事务B进行回滚,则导致事务A所读取到的数据是无效的
    • 不可重复读:不可重复读是指事务A第一次读取之后,事务B修改了数据,并且进行了提交,此时事务A进行第二次读取,发现前后读取的数据不一致(注意这里是指修改数据而不是增加或者删除数据,属于行级别)
    • 幻象读:幻象读是指事务A第一次读取之后,事务B增加或者减少了数据记录,并且进行了提交,此时事务A进行第二次读取,发现前后读取的数据记录不一致(注意这里指的是增加或者减少数据记录而不是修改数据本身,属于表级别)
  • 两类更新问题
    • 第一类丢失更新问题:事务A回滚时,把事务B已经更新并且提交的数据撤销了,导致事务B所做的操作失效
    • 第二类丢失更新问题:事务A提交时,把事务B已经更新并且提交的数据覆盖了,导致事务B所做的操作失效

数据库锁机制

  • 按照对象区分:行级锁、表级锁
  • 并发事务锁定的关系:共享锁、独占锁
    • 共享锁会防止独占锁,但允许其他共享锁,但是独占锁两者都不允许

事务隔离级别

  • 一般来说,由于手动对事务的并发进行控制是非常难的事情,所以一般的数据库都提供了相应的自动锁机制,使用者只需要指定对应的事务隔离级别
  • 四种隔离级别
    • READ_UNCOMMIT
    • READ_COMMIT
    • REPEATABLE_READ
    • SERIALIZABLE
  • 四种隔离级别对应含义以及范围如下所示
    事务四种隔离级别以及对应的范围
  • 数据库的隔离级别越高,对应的并发性能就越低,所以在选择的时候需要兼顾两者,一般采用的级别为REPEATABLE_READ也就是可重复读级别

Spring事务管理(Service Provider Interface)

Spring为事务管理定义了三个主要接口

  • PlatformTranscationManager:根据TransactionDefinition提供的事务属性配置信息创建事务,并使用TranscationStatus描述事务的状态
    • 操作方法:getTransaction、commit、rollback
    • 实现类:JpaTransactionManager、HibernateTransactionManger、DataSourceTransactionmanager、JdoTranscationManager、JtaTransactionManager
  • TransactionDefinition:描述 隔离级别、超时时间、是否为只读事务以及事务的传播规则
    • 事务隔离级别
    • ISOLATION_DEFAULT:采用底层数据库默认的隔离级别
    • ISOLATION_READ_UNCOMMIT
    • ISOLATION_READ_COMMIT
    • ISOLATION_REPEATABLE_READ
    • ISOLATION_SERIALIZABLE
  • TransactionStatus: 代表一个事务的具体运行状态
    • SavePointMange:createSavePoint、rollbackToSavepoint、releaseSavePoint
    • 方法:hasSavepoint、isNewTransaction、isCompleted、isRollbackOnly、setRollbackOnly

Spring配置事务管理的主要步骤

  1. 配置数据源
  2. 配置事务管理器,并且指定其他的事务控制属性
  3. 将数据源注入到事务管理器中,将事务管理交给Spring

事务传播行为

产生事务传播行为原因:一般情况是,事务管理是配置在Service层中,一般同一个方法处于同一个一个事务中,但是如果此时在一个Service的方法中调用另外一个Service中的方法的时候,就会出现两个事务交叉的情况,此时有不同的处理方式
事务传播行为类型及说明

总结

本小节主要学习了事务管理的基本概念、事务的四大特性以及事务的传播行为,接下来将学习如何使用Spring进行事务管理