事务什么情况下会出现异常

1、事务什么情况下会出现异常?
首先了解下异常的结构:
Throwable分为 Error, Exception;
Exception分为IOException,ClassNotFoundException,CloneNotSupportedException,RuntimeException;
下面是IOException和RuntimeException异常的子类;

Error和RuntimeException及其子类都数据非检查异常,其他继承Exception的类及其子类都属于检查异常;

对于非检查异常来说,是程序有问题,需要修改程序;
对于检查异常来说,必须在方法体中声明抛出检查异常,或使用catch语句捕获异常进行处理,否则不能通过编译;

spring事务默认配置
spring的事务管理默认是针对非检查异常(error,runtimeException)回滚,
如果使用try-catch对其异常捕获则不会进行回滚。(Error异常和RuntimeException异常抛出时不需要方法调用throws或try-catch语句);
检查异常,必须由try-catch语句捕获或由方法throws抛出,且事务默认对检查异常不进行回滚;

throws在方法体上声明,抛出异常;
throw在方法体中,抛出异常,后面必须跟异常类对象;

### Spring Boot 中的事务管理 #### 1. 默认事务管理器配置 在 Spring Boot 应用程序中,默认情况下会自动配置 `DataSourceTransactionManager` 或者其他适合的数据源事务管理器。如果应用程序中有多个数据源,则需要显式指定哪一个作为默认事务管理器。 对于大多数基于关系型数据库的应用来说,只需简单地引入依赖并设置好相应的连接池参数即可完成基本配置[^2]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 以及 application.properties 文件中的相应属性: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret ``` #### 2. @Transactional 注解使用方法 为了实现声明式的事务控制,在服务层的方法上可以加上 `@Transactional` 注解来标记该操作应该在一个新的或现有的事务内执行。当发生异常时,整个事务将会回滚;如果没有抛出任何未捕获的异常,则提交更改。 以下是几个常见的场景及其对应的处理方式: - **只读查询**: 对于只需要读取而不需要修改的操作,可以通过设置readOnly=true 来提高性能。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional(readOnly = true) public List<User> getAllUsers() { return (List<User>) userRepository.findAll(); } } ``` - **写入更新**: 当涉及到新增、删除或者批量更新等改变状态的动作时,应当省略 readOnly 属性让其保持 false 的默认值以便能够正常工作。 ```java @Service public class OrderService { @Autowired private OrderRepository orderRepository; @Transactional public void placeOrder(Order newOrder) throws Exception{ try { // 执行业务逻辑... orderRepository.save(newOrder); // 模拟可能出现错误的情况 if(true){ throw new RuntimeException("模拟失败"); } } catch(Exception e){ log.error(e.getMessage()); throw e; // 抛出异常触发事务回滚 } } } ``` #### 3. 多数据源环境下的分布式事务解决方案 随着微服务体系结构的发展,跨多个独立部署单元之间共享资源变得越来越普遍。此时就需要考虑如何有效地协调这些不同位置上的持久化动作以确保一致性。针对这种情况,有几种流行的方案可供选择: - **XA协议**:通过两阶段提交机制保证全局原子性; - **TCC模式**:Try Confirm Cancel 流程设计,适用于高并发场景下减少锁定时间的需求; - **Saga编排模型**:将长时间运行的任务拆分成一系列短小精悍的服务调用来逐步推进直至最终成功与否。 每种策略都有各自的特点和适用范围,请根据实际需求权衡利弊后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值