Spring 事务传播特性
1、事务属性的种类
- 传播行为
- 隔离级别
- 只读
- 事务超时
1.1 传播行为
- 传播行为定义了被调用方法的事务边界
PROPERGATION_MANDATORY
方法必须运行在一个事务中,如果当前事务不存在,就抛出异常PROPAGATION_NESTED
如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和PROPAGATION_REQUIRED
没有什么两样。PROGATION_NEVER
方法不能运行在一个事务中,否则会抛出异常PROGATION_NOT_SUPPORTED
方法不能运行在一个事务中,如果当前存在事务,那么该方法将被挂起PROGATION_REQUIRED
当前方法必须运行在一个事务中,如果存在事务,则运行在该事务中,否则创建一个新的事务PROGATION_REQUIRES_NEW
必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起PROGATION_SUPPORTS
当前方法不需要运行在一个事务中,如果有一个事务存在,该方法也可以运行在这个事务中。1.2 隔离级别
(1) 未提交读 (2)已提交读 (3) 可重复读 (4) 可序列化ISOLATION_DEFAULT
后端数据库默认的隔离级别ISOLATION_READ_UNCOMMITTED
允许读取未提交的数据。可能导致脏读、不可重复读、幻读(未提交读)ISOLATION_REPEATABLE_READ
一个事务不可能更新由另一个事务修改但未提交(回滚)的数据。(对应不可重复读),可避免脏读、不可重复读、但无法避免幻读ISOLATION_SERIALIZATABLE
所有的事务都在一个执行队列中,依次顺序执行,而不是并行(可序列化)。可以避免脏读、不可重复读、幻读。但效率低1.3 只读
只读数据而不更新,READ_ONLY_MARKER
1.4 事务超时
超时回滚,避免浪费系统资源1.5 理解
- 什么是未提交读? 读取未提交的数据
- 什么是脏读? 一个事务读取另一个事务未提交的数据,数据更改后,第一个事务读取的数据是脏数据,不可用。
比如:A事务对数据a进行a++操作,a未提交。B事务读取A事务的a值。但是A事务出错回滚了。这时候B事务中的a值就是脏数据,导致脏读。 - 什么是不可重复读?一个事务中两次读取一个数据的结果不一致导致的。不能重复读出相同的数据。
- 什么是幻读?事务A第一次读取数据库中数据和第二次读取的数据不一致。比如:事务A第一次读取成绩及格的学生数为20个。事务B又往数据库添加一条及格的记录。事务A第二次读取成绩几个的学生数为21个。产生幻读。数据库会使用加表级锁就可以避免。
- 可序列化?事务是一个一个排队完成。这是后可以避免上述的问题。但是效率低下。