springboot中的事务

使用:

@EnableTransactionManagement 为总开关,总闸

@Transactional 具体的函数开关,具体的灯

------------------------------------------------------------------------------------------------------------------------

失效的情况:

1. 最常见的,方法内部调用, 例如:

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

// 外部调用这个方法,它没有 @Transactional 注解
public void createUserWrong(User user) {
// ... 一些其他逻辑 ...
insertUser(user); // <--- 问题所在!这是内部调用
}

@Transactional
public void insertUser(User user) {
userMapper.insert(user);
}
}

为啥:

Spring 的事务是通过 AOP 代理实现的。当一个 Bean 被 Spring 容器管理时,Spring 会为它创建一个代理对象。外部对该 Bean 方法的调用,实际上是先调用代理对象,代理对象在调用实际方法前开启事务。而如果你在一个 Bean 的内部 ,通过 this 关键字来调用它自己的另一个方法,这个调用会直接指向原始对象,从而绕过了代理对象,事务自然就失效了。

2. 方法访问权限不够,例如:

@Service

public class OrderService {

@Transactional

private void createOrderInternal(Order order) { // <--- private 方法,事务失效

// ... 数据库操作 ...

}

}

为啥:

Spring AOP 代理默认只能拦截 public 方法。

3.异常类型没有捕捉对,例如:

@Transactional(rollbackFor = MyBusinessException.class)

public void updateStock(Long productId) throws Exception { productMapper.decreaseStock(productId);

throw new BizException("一个自定义的业务异常");

}

小插曲,如果裸一个@Transactional,哪些情况下会回滚(非受检异常):

  1. RuntimeException (运行时异常) 及其所有子类。

  2. Error (错误) 及其所有子类。

常见举例:

  • NullPointerException: 对一个 null 对象进行操作。

  • IllegalArgumentException: 传入了一个不合法的参数。

  • IndexOutOfBoundsException: 数组或列表越界。

  • IllegalStateException: 对象处于一个不正确的状态。

  • ClassCastException: 类型转换异常。

  • ArithmeticException: 数学计算异常,如除以零。

  • OutOfMemoryError: 内存溢出错误。

  • StackOverflowError: 栈溢出错误。

4. 数据库引擎不支持事务,这个不多说,项目技术选型的时候就知道了。

相关推荐
Ticnix10 分钟前
RAG 烂大街?烂大街的只是那条流水线——真正的分水岭在这五处
后端·python·agent
Wx-bishekaifayuan19 分钟前
springboot社区扶贫救助管理系统13300-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
DolphinDB36 分钟前
数据库自带 Agent:10 分钟搭起 DolphinX-Web 数据入库与分析框架
后端·架构
弈栈录44 分钟前
基于 Spring Boot 构建生产级 AI 应用平台
后端·面试·架构
小小张说故事1 小时前
LightGBM 入门指南:更快的梯度提升树,Python 实战
后端·python·机器学习
站大爷IP1 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
后端
Ticnix1 小时前
RAG 检索不准,九成的锅不在向量——不同文件,就该有不同的入库方案
后端·python·agent
福兮说1 小时前
Go 优雅退出:Shutdown 之后,后台 goroutine 还在跑(四个实测的坑)
后端·go
用户298698530141 小时前
Python 文档格式转换:Word 转 EPUB 实践
后端·python·api
德先生1 小时前
1.1-main.cpp入口解剖
后端