如果你没有深刻理解(,请谨慎使用 @Transactional
**

  • 编程式事务
  • 声明式事务

**事务的基础知识

  • 定义与概念
  • 数据库事务
  • Spring 事务的 ACID
  • 隔离级别
  • 传播机制/行为

**编程式事务

基于底层的API,如PlatformTransactionManager、TransactionDefinition 和 TransactionTemplate 等核心接口,开发者完全可以通过编程的方式来进行事务管理。

编程式事务方式需要是开发者在代码中手动的管理事务的开启、提交、回滚等操作。
**

**声明式事务

**
声明式事务管理方法允许开发者配置的帮助下来管理事务,而不需要依赖底层API进行硬编码。
开发者可以只使用注解或基于配置的 XML 来管理事务。

声明式事务管理使用了 AOP 实现的,本质就是在目标方法执行前后进行拦截。

在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。
**
使用这种方式,对代码没有侵入性,方法内只需要写业务逻辑就可以了。

声明式事务有一个局限,那就是他的最小粒度要作用在方法上。

如以下几种场景就可能导致声明式事务失效:

  • @Transactional 应用在非 public 修饰的方法上
  • ❓ @Transactional 注解属性 propagation 设置错误
  • ❓ @Transactional 注解属性 rollbackFor 设置错误
  • ❓ 同一个类中方法调用,导致@Transactional失效
  • 异常被catch捕获导致@Transactional失效
  • 数据库引擎不支持事务

总而言之,要深刻理解 代码是如何运行的, @Transactional 是如何工作的,正确使用才能不犯错,否则尽量选择更不容易出错的编程式事务。