数据库事务特性
原子性、一致性、隔离性、持久性
原子性
一个事务表示 一组操作不可分割,要么同时成功,要么同时失败。如果中间发生错误,进行回滚,回到未执行之前的状态。
一致性
事务开启前后,数据约束保证一致,业务逻辑保证一致。数据约束一致,比如保证外键约束,唯一约束等不被破坏。业务逻辑一致,比如存取款,保证金额总和一致。
隔离性
多个事务之间独立,根据隔离级别,保证事务中的读写执行中,数据的一致性。比如A事物的读,发生在B事物写之后,A是读B写之前的数据,还是之后的数据。
持久性
事务处理结束后,保证对数据的修改是永久的。
数据库隔离级别
读未提交、读已提交、重复读、序列化
读未提交
A 事务可以读到 B事务中,未提交的修改的数据。
读已提交
A 事务可以读到 B事务提交后的数据,即A事务 在 B 事务 提交前后,进行读取,可能会出现不一样的数据。
重复读
A事务 在 B 事务 提交前后,进行读取,读取的数据是一样的,即不受 B 事务的影响,不过这里局限于 Update 操作;Insert 操作的数据还是会读取到。MySQL 默认是此级别。
序列化
A事务 和B事务 串行执行,不会出现以上情况,但此时性能较差。
Spring的七种事物传播行为
类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
参考
理解事务的4种隔离级别: https://blog.csdn.net/qq_33290787/article/details/51924963
数据库事务ACID特性: https://blog.csdn.net/u012440687/article/details/52116108
Spring事务传播行为详解: https://segmentfault.com/a/1190000013341344
关于PROPAGATION_NESTED的理解: https://blog.csdn.net/yanxin1213/article/details/100582643