@Transactional
注解是 Spring 框架中用于声明事务性方法的注解之一。它可以应用在方法级别或类级别,并提供了一系列参数来定义事务的属性。以下是 @Transactional
注解的常用参数:
-
readOnly(默认值:false): 指定事务是否为只读事务。如果设置为 true,则表示这个事务只读取数据但不修改数据,可以优化事务处理性能,默认值为 false。
-
propagation(默认值:Propagation.REQUIRED): 指定事务的传播行为。包括多种传播行为,如 REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW 等。
-
isolation(默认值:Isolation.DEFAULT): 指定事务的隔离级别。包括多种隔离级别,如 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。
-
timeout(默认值:-1): 指定事务的超时时间(单位为秒)。如果事务在指定的时间内没有完成,则会自动回滚。
-
rollbackFor(默认值:{}): 指定在哪些异常情况下会触发事务回滚。可以指定一个或多个异常类。
-
noRollbackFor(默认值:{}): 指定在哪些异常情况下不会触发事务回滚。可以指定一个或多个异常类。
-
value(默认值:{}): 用于指定应该应用哪些事务管理器。通常情况下,Spring 会根据环境中存在的事务管理器来确定应该应用哪一个。
-
transactionManager(默认值:“transactionManager”): 指定应该应用哪个事务管理器。如果指定了 value,则忽略该参数。
使用 @Transactional
注解时,可以通过设置这些参数来自定义事务的行为。例如,以下是一个使用 @Transactional
注解的示例:
@Transactional(readOnly = true, timeout = 60, rollbackFor = {SQLException.class, IOException.class})
public void doSomething() {
// 执行业务逻辑
}
在这个示例中,doSomething()
方法被声明为只读事务,超时时间为 60 秒,在发生 SQLException 或 IOException 异常时触发事务回滚。
propagation参数
propagation
参数用于指定事务的传播行为,即在一个事务方法被另一个事务方法调用时,当前事务如何与调用方事务进行交互。Spring 提供了多种传播行为,通过 Propagation
枚举来表示。以下是 propagation
参数的常见取值及其含义:
-
REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。
-
SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行。适用于对事务没有严格要求的情况。
-
MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。表示调用方必须存在事务。
-
REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则将当前事务挂起。即使调用方存在事务,也会创建一个新的事务。
-
NOT_SUPPORTED: 以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
-
NEVER: 以非事务方式执行操作,如果当前存在事务,则抛出异常。
-
NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则行为类似于 REQUIRED。嵌套事务可以有自己的 savepoint,并且可以选择回滚到 savepoint 而不影响外部事务。仅支持特定的事务管理器。
通过设置 propagation
参数,可以灵活地控制事务方法之间的交互方式,确保事务的一致性和可靠性。