如果你没有深刻理解(,请谨慎使用 @Transactional
**
- 编程式事务
- 声明式事务
**事务的基础知识
- 定义与概念
- 数据库事务
- Spring 事务的 ACID
- 隔离级别
- 传播机制/行为
- …
**编程式事务
基于底层的API,如PlatformTransactionManager、TransactionDefinition 和 TransactionTemplate 等核心接口,开发者完全可以通过编程的方式来进行事务管理。
编程式事务方式需要是开发者在代码中手动的管理事务的开启、提交、回滚等操作。
**
**声明式事务
**
声明式事务管理方法允许开发者配置的帮助下来管理事务,而不需要依赖底层API进行硬编码。
开发者可以只使用注解或基于配置的 XML 来管理事务。
声明式事务管理使用了 AOP 实现的,本质就是在目标方法执行前后进行拦截。
在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。
**
使用这种方式,对代码没有侵入性,方法内只需要写业务逻辑就可以了。
声明式事务有一个局限,那就是他的最小粒度要作用在方法上。
如以下几种场景就可能导致声明式事务失效:
- @Transactional 应用在非 public 修饰的方法上
- ❓ @Transactional 注解属性 propagation 设置错误
- ❓ @Transactional 注解属性 rollbackFor 设置错误
- ❓ 同一个类中方法调用,导致@Transactional失效
- 异常被catch捕获导致@Transactional失效
- 数据库引擎不支持事务
总而言之,要深刻理解 代码是如何运行的, @Transactional 是如何工作的,正确使用才能不犯错,否则尽量选择更不容易出错的编程式事务。