@Transactional
注解在 Spring 框架中用于声明一个方法或类应该在事务中执行。事务是一种确保数据库操作要么全部成功,要么全部失败的机制,确保数据的一致性和完整性。以下是 @Transactional
注解的参数详解:
-
propagation: 事务传播行为,指定事务的传播方式。常见的传播行为有:
REQUIRED
(默认值):如果当前存在事务,则加入该事务;如果当前没有事务,则新建一个事务。REQUIRES_NEW
:每个事务都会开启一个新事务,不管当前是否存在事务。SUPPORTS
:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。NOT_SUPPORTED
:以非事务方式执行,如果当前存在事务,则挂起它。MANDATORY
:要求当前存在事务;如果当前没有事务,则抛出异常。NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。NESTED
:如果当前存在事务,则嵌套在当前事务中执行;如果当前没有事务,则新建一个事务。
-
isolation: 事务隔离级别,指定事务的隔离级别。常见的隔离级别有:
DEFAULT
:使用数据库的默认隔离级别。READ_UNCOMMITTED
:允许读取未提交的数据,可能会出现脏读。READ_COMMITTED
:只允许读取已提交的数据,可以防止脏读。REPEATABLE_READ
:在事务期间,多次读取同一数据的结果是相同的,可以防止不可重复读。SERIALIZABLE
:最高隔离级别,完全隔离的事务,防止脏读、不可重复读和幻读。
-
timeout: 事务超时时间,指定事务的超时时间(以秒为单位)。如果事务在指定的时间内没有完成,则会被强制回滚。
-
readOnly : 事务是否是只读的。设置为
true
可以优化性能,因为 Spring 可以利用只读事务来进行一些优化,防止对数据库进行写操作。 -
rollbackFor: 指定哪些异常类型会导致事务回滚。如果抛出了这些异常类型中的任何一个,则事务会被回滚。
-
noRollbackFor : 指定哪些异常类型不会导致事务回滚。如果抛出了这些异常类型中的任何一个,则事务不会回滚,即使
rollbackFor
参数中指定的异常类型被抛出。 -
rollbackForClassName : 通过异常的类名指定哪些异常会导致事务回滚。这是
rollbackFor
参数的类名字符串版本。 -
noRollbackForClassName : 通过异常的类名指定哪些异常不会导致事务回滚。这是
noRollbackFor
参数的类名字符串版本。
java
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
readOnly = false,
rollbackFor = {SQLException.class},
noRollbackFor = {CustomException.class}
)
public void someTransactionalMethod() {
// 业务逻辑
}
这些参数可以根据实际需要进行配置,以达到对事务的精确控制。