Spring事务

Spring事务管理提供了一套机制,包括PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等7种传播特性,以及READ_UNCOMMITTED到SERIALIZABLE的4种隔离级别。它可以声明式或编程式实现,基于AOP进行事务控制,如@Transaction注解用于声明事务属性。
  1. 什么是 Spring 事务管理?

Spring 事务管理是 Spring 框架中用于管理事务的一套机制。Spring 事务管理提供了统一的事务管理抽象层,允许开发者在不同的事务管理实现中进行切换,例如 JDBC API、JTA、Hibernate、JPA 等。

  1. Spring 事务管理的传播特性有哪些?

Spring 事务管理支持以下 7 种传播特性:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER 和 PROPAGATION_NESTED。

  1. 什么是 Spring 事务的隔离级别?

Spring 事务的隔离级别是指在多线程环境下,事务之间的隔离层次。Spring 支持 4 种事务隔离级别:READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)和 SERIALIZABLE(串行化)。

  1. Spring 事务管理的实现方式有哪些?

Spring 事务管理可以通过编程方式来实现,也可以通过配置文件来实现。编程式事务是通过编写代码来进行事务控制、管理事务,而声明式事务是通过配置文件、注解等方式来实现事务控制,将事务管理从业务代码中解耦,使业务代码更加简洁、易于维护。

  1. 如何配置声明式事务?

可以通过在 Spring 配置文件中进行配置,或使用注解进行配置。在配置文件中可以使用 和 标签来实现声明式事务,也可以使用 @Transactional 注解进行配置。

  1. Spring 事务的原理是什么?

Spring 事务管理的工作原理是通过 AOP 技术实现的,使用了代理设计模式和动态代理技术。Spring 通过事务代理机制为事务方法的开始或结束创建了增强代码,通过拦截方法调用,将事务边界与事务处理代码分离。

  1. 如何进行手动控制 Spring 事务?

可以使用 Spring 的事务管理接口 PlatformTransactionManager 进行手动事务控制,在 Spring 应用中需要进行更加细粒度的事务管理时,可以使用该方式手动控制事务。

8.Spring 事务管理支持的 7 种传播特性:

  1. PROPAGATION_REQUIRED

PROPAGATION_REQUIRED 是默认的传播机制,表示将当前方法加入到任何一个已经存在的事务中,如果没有事务,则开启一个新的事务。

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,如果当前已经存在一个事务,则 method2 将加入该事务中;否则,method2 将运行于一个新的事务中。

  1. PROPAGATION_SUPPORTS

PROPAGATION_SUPPORTS 表示当前方法在事务的环境下运行,如果没有事务,则以非事务方式运行。

@Transactional(propagation = Propagation.SUPPORTS)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,如果当前已经存在一个事务,则 method2 将运行在该事务中;否则,method2 将以非事务方式运行。

  1. PROPAGATION_MANDATORY

PROPAGATION_MANDATORY 表示当前方法必须在一个已经存在的事务中运行,否则将抛出异常。

@Transactional(propagation = Propagation.MANDATORY)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.MANDATORY)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,如果当前已经存在一个事务,则 method2 将运行在该事务中;否则,将抛出异常。

  1. PROPAGATION_REQUIRES_NEW

PROPAGATION_REQUIRES_NEW 表示当前方法必须在一个新的、独立的事务中运行,如果存在一个事务,将被挂起。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,会为 method2 创建一个新的事务,独立于 method1 运行。

  1. PROPAGATION_NOT_SUPPORTED

PROPAGATION_NOT_SUPPORTED 表示当前方法不在事务环境下运行,如果存在一个事务,将被挂起。

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,method2 将不会在事务环境下运行,即使当前存在一个事务也会被挂起。

  1. PROPAGATION_NEVER

PROPAGATION_NEVER 表示当前方法不应该在事务环境下运行,如果存在一个事务,则抛出异常。

@Transactional(propagation = Propagation.NEVER)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.NEVER)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,如果当前已经存在一个事务,则会抛出异常。

  1. PROPAGATION_NESTED

PROPAGATION_NESTED 表示创建一个新的事务,作为嵌套事务运行,如果存在一个事务,则该嵌套事务将在该事务的上下文中运行。

@Transactional(propagation = Propagation.NESTED)
public void method1() {
// 方法1代码块
method2();
}

@Transactional(propagation = Propagation.NESTED)
public void method2() {
// 方法2代码块
}

在上述代码中,当 method1 调用 method2 时,会为 method2 创建一个新的嵌套事务,独立于当前事务运行,如果 method2 发生异常将回滚至嵌套事务的保存点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值