沃梦达 / IT编程 / 数据库 / 正文

springboot开启声明式事务的方法

下面是springboot开启声明式事务的方法的完整攻略。

下面是springboot开启声明式事务的方法的完整攻略。

一、前置知识

在了解开启声明式事务方法之前,需要了解以下几个方面的内容:

  • 事务的概念和类型
  • Spring框架中的事务管理
  • AOP的概念及其实现

二、开启声明式事务的方法

1. 添加相关依赖包

在Spring Boot应用中需要添加spring-boot-starter-data-jpa和spring-boot-starter-aop这两个依赖包。这些包能够提供所需的事务功能和AOP特性。

<dependencies>
    <!--data jpa和事务-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!--aop-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

2. 配置数据源和JPA

在application.properties或者 application.yml文件中添加以下配置:

# 数据源相关配置
spring.datasource.url=jdbc:mysql://${mysql.host}:${mysql.port}/${mysql.database}
spring.datasource.username=${mysql.username}
spring.datasource.password=${mysql.password}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# JPA相关配置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true

其中, spring.datasource.url、spring.datasource.username和spring.datasource.password是数据源相关的信息;其他配置是JPA的相关信息。

3.启用声明式事务

在Spring Boot应用的主类上添加@EnableTransactionManagement注解。这会启用Spring的事务管理器。

@SpringBootApplication
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 编写业务逻辑层代码

在业务逻辑层(可以理解为服务层)的方法上添加@Transactional注解,以启用声明式事务。在方法被调用时,Spring会自动开启事务,并在方法执行完毕后,根据执行结果来提交或者回滚事务。下面是一个示例:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void updateUser(Long userId, String name) {
        User user = userRepository.findOne(userId);
        user.setName(name);
        userRepository.save(user);
    }
}

5. 使用事务(示例1)

在Controller层调用服务层中添加了@Transactional注解的方法,即可实现事务控制。例如,下面的代码为一次用户创建操作,如果其中任一步骤出错,将会回滚:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/add")
    public ResponseEntity<Map<String,Object>> addUser(String name, Integer age) {
        User user = new User();
        user.setName(name);
        user.setAge(age);

        try {
            userService.addUser(user);
            return ResponseEntity.ok().body(Result.success("用户创建成功"));
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Result.error("用户创建失败"));
        }
    }
}
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void addUser(User user) {
        userRepository.save(user);
        //当用户年龄不足18岁时,抛出异常,事务会回滚,用户数据不会存入数据库
        if (user.getAge() < 18) {
            throw new RuntimeException("用户年龄不能小于18");
        }
    }
}

6. 使用事务(示例2)

使用spring的事务,还可以支持同一方法中包含多个事务,设计到业务逻辑的出现了问题,可以无需全部回滚,只要将有问题的数据进行回滚即可。例如下面的代码:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private UserOrderRepository userOrderRepository;

    @Transactional
    public void userOrder(User user, UserOrder userOrder) {
        userRepository.save(user);
        try {
            userOrderRepository.save(userOrder);
        } catch (Exception e) {}
    }
}

上面的代码是在userService中实现了一个userOrder方法,该方法在一个事务中,其实是使用了Spring中的嵌套事务,即提交user成功后,提交userOrder时,业务中有异常产生,不会影响user的提交数据,在其他方法中调用userOrder方法时,只要在业务逻辑层中,判断userOrder的提交没有问题,提交成功后再提交userOrder即可,这样,可以有效的控制事务回滚的情况。

三、总结

以上就是springboot开启声明式事务的方法的完整攻略。在Spring Boot应用中,使用@Transactional注解启用声明式事务,能够有效地管理和控制事务。在业务逻辑中,我们可以合理运用嵌套事务的特性,将多个事务合并到一个业务方法中,以达到更好的控制事务的目的。

本文标题为:springboot开启声明式事务的方法