1.事务
1.1.概念
事务:逻辑上的一组操作,组成这组操作的各个单元要么全都成功要么全都失败
1.2.特点
- 原子性:事务不可分割
- 一致性:事务操作前后数据总量不变
- 隔离性:一个事务的执行不干扰其他事务
- 持久性:一旦事务结束(包括提交或回滚)数据就持久化到数据库
1.3.不考虑隔离性引发的安全问题
脏读
:是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据(一个事物读到另一个事务刚修改还未保存的数据)不可重复读
:是指在一个事务内,多次读同一数据,在这个事务还没有结束时,另外一个事务也访问该同一数据并做了修改,那么在第一个事务的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。这样就导致了在一个事务内两次读到的数据不一样,因此称为是不可重复读,即不能读到相同的数据内容(一个事物读到另一个数据已经更改(update)的数据,而导致在一个事务中的多次查询结果不一致)幻读(虚读)
:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象自己修改了全部数据行是发生了幻觉一样(一个事务读到另一个事务添加(insert)的数据,而导致在一个事务中的多次查询结果不一致)
1.4.解决问题
- 读未提交:read uncommitted,产生问题:脏读、不可重复读、幻读自己修改了全部
- 读已提交:read committed,产生问题:不可重复读、幻读
- 可重复读:repeatable read,产生问题:幻读(MySQL默认)
- 串行化:serializable,不产生问题
2.Spring的事务管理
2.1.Spring事务管理API
2.1.1.PlatformTransactionManager
PlatformTransactionManager:平台事务管理器,是Spring用于管理事务的真正对象
,它是一个接口,有两个实现类:
- DataSourceTransactionManager:底层使用JDBC管理事务
- HibernateTransactionManager:底层使用Hibernate管理事务
2.1.2.TransactionDefinition
TransactionDefinition:事务定义信息
事务定义:用于定义事务的相关信息,隔离级别、超时信息、传播行为、是否只读
2.1.3.TransactionStatus
TransactionStatus:事务的状态,用于记录在事务管理过程中,事务的状态的对象
2.2.事务管理的API的关系
Spring进行事务管理的时候,首先平台事务管理器
根据事务定义信息
进行事务的管理,在事务管理过程中会产生各种状态,将这些状态信息记录在事务状态
的对象中
2.3.Spring事务的传播行为
共提供了七种事务的传播行为:
- 保证多个操作在同一事务中
1.PROPAGATION_REQUIRED
:默认值,如果A中有事务B就使用A中的事务,如果A中没有,B创建一个新的将操作包含起来
2.PROPAGATION_SUPPORTS:支持事务,如果A中有事务B就使用A中的事务,如果没有,B就不使用事务
3.PROPAGATION_MANDATORY:如果A中有事务B就使用A中的事务,如果没有B就抛出异常 - 保证多个操作在不同事务中
4.PROPAGATION_REQUIRES_NEW
:如果A中有事务,将A的事务挂起,创建新的事务只包含B,如果A中没有事务,B就创建一个新的事务只包含B
5.PROPAGATION_NOT_SUPPORTED:如果A中有事务,将A的事务挂起,B不使用事务
6.PROPAGATION_NEVER:如果A中有事务,直接抛出异常 - 嵌套式事务
7.PROPAGATION_NESTED
:嵌套事务,如果A中有事务,按照A的事务执行,执行完后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初位置,也可以回滚到保存点