数据库事务---特性、隔离级别、传播行为

数据库事务特性

原子性、一致性、隔离性、持久性

原子性

一个事务表示 一组操作不可分割,要么同时成功,要么同时失败。如果中间发生错误,进行回滚,回到未执行之前的状态。

一致性

事务开启前后,数据约束保证一致,业务逻辑保证一致。数据约束一致,比如保证外键约束,唯一约束等不被破坏。业务逻辑一致,比如存取款,保证金额总和一致。

隔离性

多个事务之间独立,根据隔离级别,保证事务中的读写执行中,数据的一致性。比如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

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×