一. 事务的四大特性
原子性
一个事务中的所有操作,要么全部完成,要么全部不完成,事务在执行过程中发生错误,会被回滚到事务开始前的状态
一致性
在事务开始之前和事务结束之后,数据库的完整性没有被破坏。比如: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:解释脏读,不可重复读和幻读的含义
四. 事务失效场景
-
用在非public方法上
-
同一个类中一个没有事务的方法A调用一个有事务的方法B,方法B的事务失效
-
数据库不支持事务
-
异常被catch住,事务不生效