Spring 事物的隔离级别
2021-03-13 本文已影响0人
LssTechnology
前言:最近在看spring的事物
一、Spring事务隔离级别
image.png- ISOLATION_DEFAULT: 默认的隔离级别,使用数据库默认的事务隔离级别。
- ISOLATION_READ_UNCOMMITTED: 未提交读,允许一个事务读取另外一个事务未提交的数据,或造成脏读、幻读、不可重复读。
- ISOLATION_COMMITTED: 提交读,保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。防止脏读。
- ISOLATION_RETETABLE_READ: 可重复读,可以防止脏读、不可重复读,但是还会造成幻读。(在可重复读(REPEATABLE READS)隔离级别中,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁(range-locks)”,因此可能会发生“幻影读(phantom reads)”
在该事务级别下,保证同一个事务从开始到结束获取到的数据一致。这是Mysql的默认事务级别。) - ISOLATION_SERIALIZABLE: 串行事务,事务串行执行,防止脏读、不可重复读、幻读。
- 事物的隔离级别造成的问题
问题 | 描述 |
---|---|
脏读 | 一个事物读到另一个事物未提交的更新数据。所谓脏读,就是指事物A读到了事物B还没有提交的数据,比如银行取钱,事物A开启事物,此时切换到事物B,事物B开启事物 -> 取走100元,事物A读取的肯定是数据库里面的原始数据,因为事物B取走了100块,并没有提交,数据库里面的账户余额肯定还是原始余额,这就是脏读 |
幻读 | 是指当事物不是独立执行时发生的一种现象。例如第一个事物对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事物也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事物的用户发现表中还有没有修改的数据行,就好像发生幻觉一样 |
不可重复读 | 在一个事物里面的操作中发现了未被操作的数据。比方说在同一个事物中先后执行两条一模一样的select语句,期间在此次事物中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读 |
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED | 是 | 是 | 是 | 否 |
READ COMMITTED | 否 | 是 | 是 | 否 |
REPEATABLE READ | 否 | 否 | 是 | 否 |
SERIALIZABLE | 否 | 否 | 否 | 是 |
二、Spring事务传播机制
image.png-
(需要事务加入)
1. REQUIRED: 如果当前有事务就加入事务,如果没有事务则创建一个新的。
2. REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。 -
(嵌套事务)
3. NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果没有事务,相当于REQUIRED。 -
(支持,如果有就支持,如果没有就算了)
4.SUPPORTS: 如果当前存在事务,则加入该事务。如果当前没有事务,则以非事务的方式进行。 -
(不支持)
5. NOT_SUPPORTS: 以非事务方式运行。如果当前有事务,则把当前事务挂起。 -
(强制性的,一定要有,没有就抛异常)
- MANDATORY:如果当前存在事务,则运行在当前事务中。如果没有事务,则抛出异常。
-
(从不,比NOT_SUPPORT更硬,直接异常)
7. NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务。