事务:
事务:是逻辑上一组操作,要么全都成功,要么全都失败.
事务特性:ACID
ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
- 原子性(Atomicity):事务不可分割
- 一致性(Consistency):事务执行的前后,数据完整性保持一致.
- 隔离性(Isolation):一个事务执行的时候,不应该受到其他事务的打扰
- 持久性(Durability):一旦结束,数据就永久的保存到数据库.
(1)原子性(Atomicity)
- 事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性(Consistency)
- 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
(3)隔离性(Isolation)
- 指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
(4)持久性(Durability)
- 指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
如果不考虑隔离性:
- 脏读:一个事务读到另一个事务未提交数据
- 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致
- 虚读: 一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致
事务的隔离级别:
- 未提交读:以上情况都有可能发生。
- 已提交读:避免脏读,但不可重复读,虚读是有可能发生(Oracle)。
- 可重复读:避免脏读,不可重复读,但是虚读有可能发生(MySQL)。
- 串行的:避免以上所有情况.
- 默认级别. Mysql repeatable_read oracle read_commited
Spring中事务管理:
分层开发:事务处在Service层.
Spring提供事务管理API:
PlatformTransactionManager:平台事务管理器.
常用方法:
TransactionDefinition:事务定义
ISOLation_XXX:事务隔离级别.
PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)
过期时间:
TransactionStatus:事务状态
是否有保存点
是否一个新的事务
事务是否已经提交
关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,
管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.
Spring事务管理API详解:
PlatformTransactionManager:接口.
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
TransactionDefinition:
事务隔离级别(四种)
事务传播行为(七种)
传播行为:解决业务层之间的调用的事务的关系.
- PROPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个
- * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)
- PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
- * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.
- PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
- * A,B 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.
- PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
- * A,B 如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)
- PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果有事务存在,挂起当前事务
- * A,B 非事务的方式运行,A有事务,就会挂起当前的事务.
- PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
- PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
- * 基于SavePoint技术.
* A,B A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,
用户需要自己设置事务提交还是回滚.