🏆本文收录于「滚雪球学SpringBoot」专栏,手把手带你零基础入门springboot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在开发企业级应用时,事务管理是必不可少的。事务确保了数据库操作的一致性和可靠性,能够保证一组操作要么全部成功,要么全部失败。在 Spring Boot 中,事务管理不仅简化了数据库操作的管理,还支持声明式和编程式事务管理,使得事务的管理更加灵活和易于维护。
本文将介绍如何在 Spring Boot 中配置事务管理,涵盖以下内容:
- Spring Boot 中事务管理的配置:如何配置 Spring Boot 中的事务管理。
- 使用
@Transactional
注解管理事务:如何通过@Transactional
注解实现方法级别的事务管理。 - 声明式事务管理和编程式事务管理:如何使用
PlatformTransactionManager
进行编程式事务管理。 - 代码示例:展示如何在 Spring Boot 中配置和管理事务。
概述:Spring Boot 中事务管理的配置
Spring 提供了两种主要的事务管理方式:
- 声明式事务管理:通过
@Transactional
注解或者 XML 配置文件来管理事务,Spring 会自动为方法生成事务代理。 - 编程式事务管理:通过
PlatformTransactionManager
编程方式管理事务,适用于需要手动控制事务的场景。
Spring Boot 默认使用声明式事务管理,但你也可以使用编程式事务管理来实现更加灵活的事务控制。
使用 @Transactional
注解管理事务
@Transactional
注解是 Spring 提供的声明式事务管理的核心注解。通过在类或者方法上添加 @Transactional
注解,可以自动管理事务的提交、回滚等操作。
1. 启用事务管理
在 Spring Boot 中,事务管理通过 @EnableTransactionManagement
注解启用,但通常 Spring Boot 会自动启用事务管理,无需显式配置。只需要在启动类或者配置类中添加 @SpringBootApplication
或 @Configuration
注解即可。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring Boot 会自动配置 DataSource
和事务管理器(如 JpaTransactionManager
)。
2. 使用 @Transactional
注解
@Transactional
注解用于指定一个方法或类是一个事务。你可以将它添加到服务类或者方法上,Spring 会在执行该方法时自动开启事务,执行成功后自动提交事务,出现异常时自动回滚。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Transactional // 开启事务
public void addUser(String username) {
// 执行数据库操作,如插入数据
userRepository.save(new User(username));
// 可能的业务逻辑
// 如果发生异常,事务会被回滚
}
}
在上面的例子中,addUser
方法被 @Transactional
注解标注,这意味着这个方法执行时会自动管理事务。如果该方法执行过程中抛出异常,Spring 会自动回滚该事务,保证数据的一致性。
3. 事务的回滚和提交
默认情况下,只有 运行时异常(RuntimeException
) 会导致事务回滚。如果你希望其他异常(例如检查型异常)也触发回滚,可以通过 @Transactional
注解的 rollbackFor
属性进行配置。
@Transactional(rollbackFor = Exception.class) // 配置所有异常都会触发事务回滚
public void addUser(String username) {
userRepository.save(new User(username));
// 其他业务逻辑
}
如果只想回滚某种类型的异常,可以使用 rollbackFor
或 noRollbackFor
属性指定具体异常类型。
声明式事务管理与编程式事务管理
除了声明式事务管理外,Spring 还支持 编程式事务管理,通过 PlatformTransactionManager
进行手动管理。这种方式适用于需要更加灵活控制事务的场景,比如需要在方法中动态决定是否开启事务、手动提交和回滚事务等。
1. 使用 PlatformTransactionManager
进行编程式事务管理
PlatformTransactionManager
是 Spring 的核心接口,用于管理事务的提交、回滚和状态查询。你可以在服务中通过 PlatformTransactionManager
来手动管理事务。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class UserService {
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private UserRepository userRepository;
public void addUserWithTransaction(String username) {
// 开始事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("MyTransaction");
def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 执行业务逻辑
userRepository.save(new User(username));
// 提交事务
transactionManager.commit(status);
} catch (Exception e) {
// 出现异常时回滚事务
transactionManager.rollback(status);
throw e;
}
}
}
在这个示例中:
- 我们使用
PlatformTransactionManager
获取一个事务状态(TransactionStatus
)。 - 如果业务逻辑执行成功,调用
transactionManager.commit(status)
提交事务。 - 如果出现异常,则调用
transactionManager.rollback(status)
回滚事务。
2. 配置事务管理器
Spring Boot 默认配置了合适的事务管理器(例如 JpaTransactionManager
),但如果你需要使用其他类型的事务管理器(例如针对 JDBC
的 DataSourceTransactionManager
),你可以通过配置类来显式指定。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
代码示例:配置和管理事务
以下是一个完整的示例,展示如何在 Spring Boot 中使用 @Transactional
注解进行事务管理,并结合编程式事务管理控制事务的提交和回滚。
1. application.properties
配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
2. 服务类使用 @Transactional
注解
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional // 启用事务
public void addUser(String username) {
userRepository.save(new User(username));
// 其他操作,若出现异常则回滚事务
}
}
3. 编程式事务管理
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class UserService {
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private UserRepository userRepository;
public void addUserWithTransaction(String username) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("MyTransaction");
def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
userRepository.save(new User(username));
transactionManager.commit(status); // 提交事务
} catch (Exception e) {
transactionManager.rollback(status); // 回滚事务
throw e;
}
}
}
总结
在 Spring Boot 中配置事务管理非常简单,可以通过以下两种方式进行事务管理:
- 声明式事务管理:通过
@Transactional
注解轻松实现方法级别的事务控制。 - 编程式事务管理:使用
PlatformTransactionManager
来手动管理事务,适用于需要精细控制事务的场景。
通过这两种方式,Spring Boot 为我们提供了灵活、强大的事务管理支持,可以轻松确保数据库操作的一致性和可靠性。
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击[这里];硬核微信公众号[「猿圈奇妙屋」],欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
<div align="center"><img width="780" height="" src="https://i-blog.csdnimg.cn/direct/f7f3d1c620174b5ebd4d74b7255a33ad.png"/></div>
-End-