Spring Transaction
- Spring事务是基于数据库本身的事务机制处理的
事务有四种特性, 简称 ACID
- 原子性(Atomicity)是事务中最基本的操作单元, 如果在执行过程中发生错误,将会回滚到事务开始前的状态, 也就是要么成功, 要么全部失败
- 一致性(Consistency)指的是事务执行之前和执行之后数据库一致的状态. 如果事务成功完成, 那么系统中的所有变化将会正确应用, 如果在事务中出现错误, 那么系统中的所有变化将会自动回滚
- 隔离性(Isolation)指的是在并发中, 当不同的事务同时操作相同的数据时, 每个事务都有各自的完整数据空间. 锁定的数据状态要么是其它事务修改开始前的状态或修改结束后的状态
- 持久性(Durability)指的是事务成功后, 所更新的数据是永久保存的. 即使服务器宕机, 重启数据库或系统
事务的传播规则
- PROPAGATION_REQUIRED: 如果当前没有事务, 就新建一个事务, 或如果事务已存在, 就加入到这个事务中, 这个是 Spring默认选项
- PROPAGATION_SUPPORTS: 如果当前存在事务, 则加入该事务, 或如果没有事务, 就以非事务的方式执行
- PROPAGATION_MANDATORY: 如果当前存在事务, 则加入该事务, 或如果没有事务, 则抛出异常
- PROPAGATION_REQUIRES_NEW: 新建事务, 如果当前存在事务, 就把事务挂起
- PROPAGATION_NOT_SUPPORTED: 以非事务方式执行, 如果当前存在事务, 就把事务挂起
- PROPAGATION_NEVER: 以非事务方式执行, 如果当前存在事务, 则抛出异常
- PROPAGATION_NESTED: 如果当前存在事务, 则在嵌套事务内执行, 如果当前没有事务, 则该取值等价于 PROPAGATION_REQUIRED
事务隔离级别
事务的第二个维度是隔离级别(Isolation Level). 隔离级别定义了一个事务可能受其它并发事务影响的程度
- ISOLATION_DEFAULT: 使用数据库的默认隔离级别, 一般该级别与 ISOLATION_READ_COMMITTED相等
- ISOLATION_READ_UNCOMMITTED: 最低的隔离级别, 允许读取尚未提交的数据变更, 该级别不能防止脏读,幻读以及不可重复读
- ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据变更, 该级别可以防止脏读, 但不能防止幻读和不可重复读
- ISOLATION_REPEATABLE_READ: 在事务处理过程中, 多次重复查询某语句, 此时返回记录都是相同的. 即使有新增的数据满足该条件, 也会被忽略, 该级别可以防止脏读和不可重复读, 但不能防止幻读
- ISOLATION_SERIALIZABLE: 最高的隔离级别, 完全服从ACID的隔离级别, 该级别可以防止脏读, 幻读和不可重复读. 但是对系统的性能损耗是最大的
脏读, 幻读以及不可重复读的概念说明
- 脏读(Dirty Read): 一个事务读取另一个事务修改但尚未提交的数据叫做脏读
- 不可重复读(NonRepeatable Read): 一个事务执行相同的查询多次, 并得到不同的数据时. 这通常是因为在此查询期间, 其它并发事务进行了相同条件内数据的更新
- 幻读(Phantom Read): 幻读与不可重复读类似, 区别是相同条件内数据有新增时叫做幻读
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!