springboot_开启事务

本文介绍如何在SpringBoot中配置并使用事务管理器,通过注入DataSourceTransactionManager实现事务控制。示例展示了在OrderService中使用@Transactional注解进行事务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot_开启事务

注入事务管理器

前提是dataSource已经注入到spring容器中

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
	return new DataSourceTransactionManager(dataSource);
}

@Transactional

当注入事务管理器后,可以使用@Transactional此时事务就好用了

@Service
public class OrderService {
	@Autowired
	private DaoSupport daoSupport;
	
	@Transactional
	public int insert() {
		0rderInfoPo orderInfoPo = new 0rderInfoPo();
		orderInfoPo.insert(xxx);
	}
}
### Spring Boot 中开启事务的配置方式与示例 在 Spring Boot 中,事务管理是通过 `@Transactional` 注解来实现的。该注解可以应用于类或方法级别,用于定义事务边界和行为[^2]。为了正确开启事务,需要确保以下几点: #### 1. 引入依赖 首先,确保项目中引入了 Spring Boot 的事务管理依赖。通常情况下,Spring Boot Starter 数据库相关的依赖已经包含了事务支持。例如,使用 MySQL 数据库时,可以在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` #### 2. 配置数据源 在 `application.properties` 或 `application.yml` 文件中配置数据源信息。例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 3. 使用 `@EnableTransactionManagement` 确保在主应用程序类或配置类上添加 `@EnableTransactionManagement` 注解以启用事务管理功能。通常,Spring Boot 会自动配置此注解,但如果手动配置数据源,则需要显式声明。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication @EnableTransactionManagement public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 4. 应用 `@Transactional` 注解 在需要事务支持的服务类或方法上添加 `@Transactional` 注解。例如: ```java import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Transactional public void saveUserAndAddress(User user, Address address) { // 假设这里调用了 userRepository 和 addressRepository 的保存方法 userRepository.save(user); addressRepository.save(address); // 如果此处抛出异常,事务将回滚 if (user.getAge() < 18) { throw new IllegalArgumentException("用户年龄必须大于等于18岁"); } } } ``` #### 5. 自定义事务属性(可选) 可以通过 `@Transactional` 注解的参数来自定义事务行为。例如,指定回滚规则或隔离级别: ```java @Transactional(readOnly = false, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) public void updateUserData(User user) { userRepository.update(user); } ``` #### 6. 手动事务管理(可选) 如果需要更细粒度的控制,可以使用 `PlatformTransactionManager` 手动管理事务。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; @Service public class ManualTransactionService { @Autowired private DataSourceTransactionManager transactionManager; public void manualTransactionExample() { TransactionDefinition definition = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(definition); try { // 执行业务逻辑 userRepository.save(new User()); transactionManager.commit(status); // 提交事务 } catch (Exception e) { transactionManager.rollback(status); // 回滚事务 } } } ``` ### 注意事项 - 默认情况下,Spring Boot 事务仅在抛出 `RuntimeException` 或 `Error` 时回滚。如果需要在其他异常类型下回滚,可以配置 `rollbackFor` 属性。 - 确保事务方法是被外部调用的,而不是在同一类内直接调用。否则,Spring 的 AOP 代理机制可能无法生效[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值