版权声明
- 本文原创作者:寻遍人间 .
- 作者博客地址:https://blog.csdn.net/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种事务的隔离级别(解决读问题)
当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。
并发事务所导致的问题可以分为下面三种类型:
- 脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
- 不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
- 虚幻读:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
设置事务隔离级别
- ISOLATION_DEFAULT(default):默认的事务隔离级别,跟具体的数据有关,mysql默认的事务隔离级别是repeatable_read。
- ISOLATION_READ_UNCOMMITTED(read_uncommitted):读未提交,一个事务可以感知或者操作另外一个未提交的事务。脏读,不可重复读,虚幻读都有可能发生。
- ISOLATION_READ_COMMITTED(read_committed):读已提交,一个事务只能感知或者操作另一个已经提交的事务。避免脏读,但是不可重复读和虚幻读都有可能发生。
- ISOLATION_REPEATABLE_READ(repeatable_read):这种事务隔离级别可以防止脏读,不可重复读,但是可能出现虚幻读。
- ISOLATION_SERIALIZABLE(serializable):串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,虚幻读。
或参见下图,