事务隔离级别
Spring 提供了以下五种事务隔离级别,用于控制多个事务之间的相互影响:
-
DEFAULT(默认隔离级别): 使用底层数据库的默认隔离级别。通常为数据库的默认隔离级别,如 MySQL 是 REPEATABLE READ,Oracle 是 READ COMMITTED。
-
READ_UNCOMMITTED(读取未提交数据): 允许事务读取未提交的数据。这是最低的隔离级别,它允许脏读、不可重复读和幻读的发生。
-
READ_COMMITTED(读取已提交数据): 确保一个事务只能读取到已经提交的数据。它避免了脏读,但允许不可重复读和幻读。
-
REPEATABLE_READ(可重复读): 确保一个事务在其生命周期内看到的数据是一致的,不受其他事务的影响。它避免了脏读和不可重复读,但允许幻读。
-
SERIALIZABLE(串行化): 最高的隔离级别,确保事务串行执行,避免了脏读、不可重复读和幻读。它会在事务执行期间对数据进行锁定,可能导致性能问题。
@Transactional(isolation = Isolation.READ_COMMITTED)
public void doSomething() {
// ...
}
Spring事务传播机制分类
Spring 的事务传播机制定义了在不同的事务方法之间如何传播事务。
-
PROPAGATION_REQUIRED
(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。这是大多数情况下的默认选择。 -
PROPAGATION_SUPPORTS
:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 -
PROPAGATION_MANDATORY
:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 -
PROPAGATION_REQUIRES_NEW
:每次都会创建一个新事务,如果当前存在事务,则将当前事务挂起。 -
PROPAGATION_NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。 -
PROPAGATION_NEVER
:以非事务方式执行操作,如果当前存在事务,则抛出异常。 -
PROPAGATION_NESTED
:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyService {
@Transactional(propagation = Propagation.REQUIRED)
public void methodWithRequiredPropagation() {
// 业务逻辑代码
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodWithRequiresNewPropagation() {
// 业务逻辑代码
}
@Transactional(propagation = Propagation.NESTED)
public void methodWithNestedPropagation() {
// 业务逻辑代码
}
// 其他方法...
}
注意嵌套和加入事务的区别
嵌套事务是在已经有的事务中加入另一个事务,相当于套娃的存在
也就是说在一个已存在的事务中开启另一个事务。这个嵌套的事务在外部事务的范围内,是外部事务的一部分。嵌套事务拥有自己的事务属性(例如隔离级别、传播行为等),但它的提交或回滚会影响到外部事务的状态。如果嵌套事务回滚,那么只有整个外部事务回滚,而不会单独回滚嵌套事务。
而加入事务是在已经有事务加入进去,本质上和原来的事务还是同一个
被加入的事务和外部事务是同一个事务,它们共享同一个事务范围和属性。如果加入的事务回滚,那么整个事务都会回滚。
总结
-
事务范围: 嵌套事务和加入事务都是在已经存在的事务内部发生的,但嵌套事务可以有自己的保存点(Savepoint),而加入事务不具备自己的保存点,它们共享外部事务的保存点。
-
回滚影响: 嵌套事务的回滚只影响外部事务的状态,而不会单独回滚嵌套事务。加入事务的回滚会导致整个事务回滚。
-
行为表现: 嵌套事务在某些情况下允许内部事务独立地提交或回滚,相对来说更具有灵活性。加入事务则更多地表现为一个整体事务,内外事务共享相同的提交或回滚动作。
事务的使用
测试方法设置不自动回滚
注意: 测试方法会自动回滚!!!
@Rollback(false) // 禁用自动回滚
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ