Mysql数据库隔离级别以及事务的传播机制

265 阅读2分钟

一. 事务的四大特性

原子性

一个事务中的所有操作,要么全部完成,要么全部不完成,事务在执行过程中发生错误,会被回滚到事务开始前的状态

一致性

在事务开始之前和事务结束之后,数据库的完整性没有被破坏。比如:A向B转账,不可能A扣了钱,B却没收到

隔离性

数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致的 数据不一致

持久性

事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失

二. Spring中传播机制详解

REQUIRED

支持当前事务,如果当前没有事务,就新建一个事务(如果方法A和方法B都添加了注解,A方法调用B方法,会把两个事务合并为一个事务)

SUPPORTS

支持当前事务,如果当前没有事务,就以非事务的方式执行

MANDATORY

支持当前事务,如果当前没有事务,就抛出异常

REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起(类A中的a方法用默认Propagation.REQUIRED模式,类B中的b方法用Propagation.REQUIRES_NEW模式,然后在a方法中调用b方法操作数据库,a方法抛出异常后,b方法并不会回滚,因为Propagation.REQUIRES_NEW会暂停a方法的事务)

NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

NEVER

以非事务方式执行,如果当前存在事务,则抛出异常

NESTED

支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务

三. 数据库的隔离级别

TODO:解释脏读,不可重复读和幻读的含义

四. 事务失效场景

  1. 用在非public方法上

  2. 同一个类中一个没有事务的方法A调用一个有事务的方法B,方法B的事务失效

  3. 数据库不支持事务

  4. 异常被catch住,事务不生效