Bootstrap

java中@Transactional详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在Java中,@Transactional是一个非常重要的注解,用于声明事务管理的行为。它可以被应用在类级别或方法级别上,并且提供了多种选项来控制事务的传播行为、隔离级别、超时设置和回滚条件等。


一、作用范围

@Transactional注解可以用于以下两个级别:

  • 类级别:当应用在类上时,表示类中的所有方法都将按照相同的事务属性进行处理。
  • 方法级别:当应用在方法上时,仅对该方法内的数据库操作生效。

二、常用属性

  • propagation:事务的传播行为,默认值是Propagation.REQUIRED。它定义了在方法调用链中已存在事务时,当前方法如何处理事务。例如,REQUIRED表示如果已存在事务,则加入该事务;REQUIRES_NEW表示无论是否存在事务,都会开启一个新事务。
  • isolation:事务的隔离级别,默认值是Isolation.DEFAULT。它定义了事务在并发情况下的隔离程度,包括未提交读、提交读、可重复读和串行化等级别。
  • timeout:事务超时时间,默认值是TransactionDefinition.TIMEOUT_DEFAULT,单位为秒。如果事务在超时时间内没有完成,则自动回滚。
  • readOnly:指定事务是否为只读事务,默认值是false。如果设置为true,则表示这个事务只读取数据但不修改数据,这样可以帮助数据库系统优化事务。
  • rollbackFor /
    rollbackForClassName:定义在哪些异常发生时需要回滚事务。可以指定异常类或异常类名的列表。例如,@Transactional(rollbackFor = Exception.class) 表示遇到任何异常都会回滚事务。
  • noRollbackFor / noRollbackForClassName:定义在哪些异常发生时不需要回滚事务。

三、使用示例

以下是一个简单的示例,演示了如何在Spring Boot中使用@Transactional注解:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30)
    public void updateUser(User user) {
        // 更新用户信息
        userRepository.save(user);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
    public void createUser(User user) {
        // 创建用户
        userRepository.save(user);
    }
}

在上述示例中,updateUser方法使用了默认的事务属性,而createUser方法则显式指定了事务传播行为为REQUIRES_NEW,并设置了隔离级别为READ_COMMITTED。

四、注意事项

  • @Transactional注解只对public方法有效,因为它是通过Spring AOP来实现的。
  • 默认情况下,@Transactional只回滚RuntimeException及其子类异常,而不回滚Checked
    Exception。如果需要回滚其他类型的异常,可以通过rollbackFor属性指定。
  • 在SpringBoot中,通常建议在Service层使用@Transactional来管理事务,而不是在Controller或Repository层使用。

总结

@Transactional是一个强大的事务管理工具,通过它可以方便地控制事务的行为,确保数据库操作的一致性和完整性。

;