版权声明
- 本文原创作者:寻遍人间 .
- 作者博客地址:https://blog.youkuaiyun.com/qq_41074129
Spring事务管理的4个关键属性(4种特性)(ACID)
- 原子性(atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做,强调事务的不可分割。
- 一致性(consistency):事务的执行前后数据的完整性应保持一致,数据不会因为事务的执行而遭到破坏。
- 隔离性(isolation):一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰,以防止数据损坏。
- 持久性(durability):一个事物一旦提交,它对数据库的改变就是永久的。
Spring事务管理的7种传播属性
PROPAGION_XXX:事务的传播行为
保证同一个事务中
- PROPAGATION_REQUIRED(required):支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_REQUIRES_NEW(requires_new):新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_SUPPORTS(supports):支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_NOT_SUPPORTED(not_supported):以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_MANDATORY(mandatory):支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_NEVER(never):以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED(nested):若调用方存在事务,则运行一个嵌套事务,若调用方不存在事务,则以Propagation.REQUIRED的方式运行,即开启一个新的事务。
或参见下图,
Spring框架中的5种事务的隔离级别(解决读问题)
当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。
并发事务所导致的问题可以分为下面三种类型:
- 脏读:指当事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,事务B也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么事务B读到的这个数据是脏数据,是不可用的。
- 不可重复读:指在一个事务内,多次读同一数据。例如事务A读取了一条数据,然后执行操作的时候,事务B将这条数据操作修改了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。
- 虚幻读:指当事务不是独立执行时发生的一种现象,例如事务A首先根据条件检索得到一些数据,然后事务B改变了这些数据之外的数据或者增加了几条符合事务A搜索条件的数据,导致事务A再次检索发现变化和多了些条数据了,就产生了幻读,像发生了幻觉一样。
设置事务隔离级别
- ISOLATION_DEFAULT(default):默认的事务隔离级别,跟具体的数据有关,mysql默认的事务隔离级别是repeatable_read。
- ISOLATION_READ_UNCOMMITTED(read_uncommitted):读未提交,一个事务可以感知或者操作另外一个未提交的事务。脏读,不可重复读,虚幻读都有可能发生。
- ISOLATION_READ_COMMITTED(read_committed):读已提交,一个事务只能感知或者操作另一个已经提交的事务。避免脏读,但是不可重复读和虚幻读都有可能发生。
- ISOLATION_REPEATABLE_READ(repeatable_read):这种事务隔离级别可以防止脏读,不可重复读,但是可能出现虚幻读。
- ISOLATION_SERIALIZABLE(serializable):串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,虚幻读。
或参见下图,