Spring的五种事务隔离级别、7种事务传播机制

本文详细解释了脏读、不可重复读及幻读等概念,并介绍了Spring中的五种事务隔离级别,包括ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED等,以及七种事务传播机制,如PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、解释

1.脏读:当一个事务读取某个数据,并对它进行了修改,但是未提交到数据库;这时,另一个事务也访问到了这个数据,并进行了进一步的处理,就产生了未提交的数据依赖的关系。脏数据就是指修改了但未提交,处于待定状态的数据(可能提交也可能回滚)。

2.不可重复读:一个事务多次读取一条数据,在两次读取同一数据的中间,有另一个事务读取这个数据并进行了修改,则会导致该事务两次读取到的数据内容不一致。这就称为不可重复读。

3.幻读:是指当事务非独立执行时发生的一种现象。当一个事务对一个表中的所有行的某项数据进行了修改,例如从“a”修改为“b”;而这时另一个事务对这个表进行了插入操作,依然以“a”的值作为提交的数据。当事务1重新查询的时候,会发现又出现了修改前的数据,以为是未修改,像出现了幻觉一样,这就是幻读,也叫虚读。

二、五种事务隔离级别

Spring在TransactionDefinition接口中定义了一下五个不同的事务隔离级别:

1.ISOLATION_DEFAULT:这是一个PlatformTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

2.ISOLATION_READ_UNCOMMITTED: 这是事务最低的一个隔离级别。它表示允许事务2访问到事务1未提交的数据,所以,这种隔离级别会产生脏读、幻读、不可重复读。

3.ISOLATION_READ_COMMITTED: 保证了事务1修改后的数据提交后才能被事务2读取,未提交的数据不能被其他事务读取。这就避免了脏读,但不可避免幻读和不可重复读。

4.ISOLATION_REPEATABLE_READ: 既保证了一个事务未提交的已修改数据不能被其他事务读取,也保证了不会发生不可重复读,但不能避免幻读。

5.ISOLATION_SERIALIZABLE: 花费代价最高但是最可靠的一种事务隔离级别。事务被处理为顺序执行,避免了幻读、不可重复读。脏读。

三、七种事务传播机制

在声明式的事务处理中,要配置一个切面, 其中就用到了propagation,表示打算对这些方法怎么使用事务:

1.PROPAGATION_REQUIRED: 如果当前存在一个事务,则支持当前事务。如果没有事务,则开启一个新事务。

2.PROPAGATION_SUPPORTS: 如果存在事务,则支持当前事务。如果没有,以非事务方式执行。

3.PROPAGATION_MANDOTARY: 如果存在事务,则支持当前事务;如果没有一个活动的事务,则抛出异常。

4.PROPAGATION_REQUIRES_NEW: 总是开启一个新事务;如果当前存在事务,就把当期事务挂起。

5.PROPAGATION_NOT_SUPPORTED: 总是非事务的执行,并挂起任何存在的事务。

6.PROPAGATION_NEVER: 总是以非事务方式执行,如果存在一个活动的事务,就抛出异常。

7.PROPAGATION_NESTED: 如果当前事务存在,支持当前事务,并运行在一个嵌套的事务中;如果没有活动的事务,就新建一个事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值