Spring (27)Spring中的声明式事务管理

声明式事务管理是Spring框架支持的一种事务管理方式,它允许你通过配置来管理事务,而不是通过编程的方式。这意味着开发者可以声明哪些方法由事务支持,而具体的事务处理逻辑则由Spring框架来完成。

核心概念

  • Transaction: 数据库事务是一个作为单个逻辑工作单元执行的一系列操作,它们要么全部完成,要么全部不完成。
  • PlatformTransactionManager: Spring的事务管理接口,定义了事务管理的基本方法,如开启、提交和回滚事务。
  • TransactionDefinition: 定义了事务的传播行为和隔离级别等属性。
  • Transactional: 一个用于声明式事务的注解,可以应用于类定义或方法上,用于定义相关的事务属性。

如何工作

在Spring中使用声明式事务管理通常涉及以下几个步骤:

  1. 配置事务管理器:首先需要配置一个PlatformTransactionManager实例。在大多数情况下,这会是针对具体数据库技术的特定实现,例如DataSourceTransactionManager用于JDBC。

  2. 使用@Transactional注解:你需要在方法或类上使用@Transactional注解来声明哪些方法是事务性的。

  3. Spring的AOP:Spring使用AOP(面向切面编程)代理方法,确保被注解的方法在事务上下文中执行。

使用声明式事务管理的步骤

  1. 添加依赖:确保Spring框架和数据库相关的依赖已经添加到你的项目中。

  2. 配置事务管理器

@Configuration
@EnableTransactionManagement
public class AppConfig {

    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
  1. 声明@Transactional
@Service
public class BookService {

    private final BookRepository repository;

    public BookService(BookRepository repository) {
        this.repository = repository;
    }

    @Transactional
    public void addBook(Book book) {
        repository.save(book);
    }
}
  1. 启动Spring应用程序
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

理解Spring的声明式事务管理

在Spring中,声明式事务管理是通过AOP和事务建言来实现的:

  • AOP Proxy: 当你在一个方法上使用@Transactional注解时,Spring会在运行时为这个方法创建一个代理。
  • Before Advice: 在方法执行前,代理会启动一个新的事务(或加入一个已存在的事务)。
  • After Advice: 方法执行后,代理决定是提交还是回滚事务。

如果方法执行期间抛出了异常,Spring的事务基础设施代码将自动回滚事务。默认情况下,如果抛出的是非受检异常(如RuntimeException或其子类)或者Error,事务回滚;对于受检异常则不回滚。你可以通过@Transactional注解的rollbackFornoRollbackFor属性来定制这个行为。

代码演示

@Service
public class AccountService {

    private final AccountRepository accountRepository;

    @Autowired
    public AccountService(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }

    @Transactional(rollbackFor = Exception.class)
    public void transferMoney(Long sourceId, Long targetId, BigDecimal amount) {
        Account source = accountRepository.findById(sourceId).orElseThrow();
        Account target = accountRepository.findById(targetId).orElseThrow();

        source.debit(amount);
        target.credit(amount);

        accountRepository.save(source);
        accountRepository.save(target);

        if (source.getBalance().compareTo(BigDecimal.ZERO) < 0) {
            throw new InsufficientFundsException();
        }
    }
}

在这个例子中,transferMoney方法被标记为@Transactional,这意味着整个方法执行在一个事务上下文中。如果source账户在转账后余额变为负数,则会抛出一个InsufficientFundsException,Spring将自动回滚事务,确保数据的一致性。

特别注意

  • 事务的传播行为:可以通过@Transactional注解的propagation属性来指定,例如REQUIREDREQUIRES_NEW等。
  • 事务的隔离级别:通过isolation属性来指定,例如READ_COMMITTEDSERIALIZABLE等。

总结

Spring的声明式事务管理提供了一种简洁的方式来管理事务,让开发者可以专注于业务逻辑。通过使用@Transactional注解和配置一个合适的PlatformTransactionManager,开发者可以很容易地在应用程序中添加事务支持,并根据需要对事务行为进行微调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

辞暮尔尔-烟火年年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值