springboot-数据库事务支持

事务支持

Spring Boot 中的事务管理主要依赖于 Spring Framework 提供的功能。Spring 为事务管理提供了两种方式:编程式事务管理和声明式事务管理。在实际开发中,声明式事务管理由于其简洁性和易于使用的特点而更受欢迎。

编程式事务管理

编程式事务管理涉及到在代码中手动控制事务的开始、提交和回滚。这种方式适用于需要精确控制事务边界的情况。例如:

@Autowired
private PlatformTransactionManager transactionManager;

public void doWork() {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(def);
    
    try {
        // 执行业务逻辑
        // ...
        
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
    }
}

声明式事务管理

声明式事务管理通过使用 XML 配置或者 @Transactional 注解来实现。这种方式更为常见,因为它简化了事务边界定义,并且不需要在每个方法中显式地管理事务。

使用 @Transactional 注解

要使用 @Transactional 注解,你需要将它应用到需要事务的方法或类上。例如:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }
}

在这个例子中,createUser 方法会被自动包裹在一个数据库事务中。如果该方法执行过程中发生异常,则事务会自动回滚。

配置事务管理器

为了使用 @Transactional 注解,需要配置一个事务管理器。对于使用 JPA 或 Hibernate 的应用程序,通常会有一个默认的事务管理器,你可以直接使用它。

@Configuration
@EnableTransactionManagement
public class AppConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory().getObject());
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan("com.example.domain");
        return em;
    }
}
@Transactional 的一些属性
  • readOnly: 如果设置为 true,则表示事务是只读的,可以提高性能。但需要注意的是,如果数据库驱动不支持只读事务,则不会有任何效果。
  • propagation: 指定事务传播行为,默认是 REQUIRED,即存在事务则加入,否则新建一个事务。
  • isolation: 指定事务的隔离级别,默认是数据库的默认隔离级别。
  • timeout: 指定事务的超时时间(以秒为单位),超过这个时间则自动回滚。
  • rollbackFor: 指定导致事务回滚的异常类型列表。
  • noRollbackFor: 指定即使发生异常也不回滚的异常类型列表。

isolation 事务隔离级别

Spring Boot 支持的事务隔离级别主要有以下五种:

  1. READ_UNCOMMITTED(读未提交):这是最低的隔离级别,一个事务可以读取到另一个事务未提交的数据。这种隔离级别可能会导致脏读、不可重复读和幻读。

  2. READ_COMMITTED(读已提交):这是大多数数据库系统的默认隔离级别。在这个隔离级别下,一个事务只能读取到另一个事务已经提交的数据。这种隔离级别可以避免脏读,但仍然可能导致不可重复读和幻读。

  3. REPEATABLE_READ(可重复读):在这个隔离级别下,一个事务在整个过程中可以多次读取到相同的数据行,即使在这个事务执行过程中,其他事务对这些数据行进行了修改或插入。这种隔离级别可以避免脏读和不可重复读,但仍然可能导致幻读。

  4. SERIALIZABLE(串行化):这是最高的隔离级别,它要求事务串行执行,即一个事务在执行过程中,其他事务不能对其访问的数据进行修改。这种隔离级别可以避免脏读、不可重复读和幻读,但由于事务串行执行,会导致性能下降。

  5. DEFAULT(默认):这是 Spring Boot 默认的事务隔离级别,它的具体值取决于底层数据库系统的默认隔离级别。

在 Spring Boot 中,你可以通过 @Transactional 注解的 isolation 属性来设置事务隔离级别,例如:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void someMethod() {
    // ...
}

注意:不同的数据库系统可能支持的事务隔离级别有所不同,具体请参考你所使用的数据库系统的文档。

propagation 事务传播机制

Spring Boot中的事务传播机制定义了在一个方法调用另一个方法时,事务如何传播。Spring提供了7种事务传播行为,分别是:

  1. PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。

  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

  3. PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。

  4. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务。

在Spring Boot中,你可以使用@Transactional注解的propagation属性来设置事务传播机制,例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethod() {
    // ...
}

在这个例子中,我们将someMethod方法的事务传播机制设置为REQUIRES_NEW,这意味着每次调用这个方法时,都会创建一个新的事务,即使当前已经存在一个事务。

注意:不同的传播机制可能会导致不同的事务行为,因此在选择传播机制时需要根据具体的业务需求进行权衡。

Spring Boot中,你可以使用@Transactional注解来管理数据库事务事务是一组操作,被视为一个单独的单元,并且要么全部成功提交,要么全部回滚以保持数据的一致性。 要在Spring Boot中使用事务,你可以按照以下步骤进行操作: 1. 在你的Spring Boot应用程序的配置类上添加@EnableTransactionManagement注解,以启用事务管理器。 2. 在需要进行事务管理的方法上添加@Transactional注解。这可以是在你的Service类中的方法上,或者是在带有数据库操作的Repository类中的方法上。 3. 当你调用带有@Transactional注解的方法时,Spring会自动为你管理事务的开始、提交和回滚。 下面是一个示例: ```java @Service @Transactional public class UserService { @Autowired private UserRepository userRepository; public void createUser(User user) { userRepository.save(user); } public void updateUser(User user) { userRepository.save(user); } public void deleteUser(User user) { userRepository.delete(user); } } ``` 在上面的示例中,我们在`UserService`类上添加了`@Transactional`注解,并在`createUser`、`updateUser`和`deleteUser`方法上使用了`userRepository`进行数据库操作。当这些方法被调用时,如果发生异常,事务将会回滚并保持数据的一致性。 请注意,数据库事务的具体配置取决于你所使用的数据库。默认情况下,Spring Boot使用的是基于注解的声明式事务管理,但你也可以配置使用编程式事务管理或者使用其他的事务管理器。 希望这能帮到你!如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值