1. 事务问题概述
- 事务问题主要来源于数据库,与数据库事务紧密相关。
- 事务的四大特性(ACID):
- 原子性(Atomicity):事务要么完全执行,要么完全不执行。
- 一致性(Consistency):事务执行前后数据库保持有效状态。
- 隔离性(Isolation):并发事务相互不干扰。
- 持久性(Durability):事务提交后,其结果对数据库的影响是持久的。
2. @Transactional
注解
@Transactional
是Spring框架提供的事务管理注解。- 它依赖于数据库的事务能力,不支持事务操作的数据库或中间件将无法使用。
3. @Transactional
的使用
- 可以用于类、接口或方法。
- 官方不推荐用于接口,因为AOP操作可能导致失效。
- 如果类和方法同时标注,以方法的配置为准。
4. @Transactional
注解的参数
- 事务传播行为(propagation):控制事务的创建和加入方式。
REQUIRED
:默认值,加入现有事务或创建新事务。REQUIRES_NEW
:总是创建新事务,挂起现有事务。NESTED
:嵌套事务。MANDATORY
:必须在现有事务中运行。NEVER
:不能在事务中运行。NOT_SUPPORTED
:不支持事务。SUPPORTS
:支持事务,也可以非事务方式运行。
- 事务隔离级别(isolation):与数据库隔离级别一致。
DEFAULT
:使用数据库默认隔离级别。READ_UNCOMMITTED
:读未提交。READ_COMMITTED
:读已提交。REPEATABLE_READ
:可重复读。SERIALIZABLE
:串行化。
- 超时时间(timeout):事务完成的最长时限。
- readOnly:指定事务是否为只读。
- rollbackFor:指定触发事务回滚的异常类型。
- noRollbackFor:指定不触发回滚的异常类型。
5. @Transactional
与AOP
- AOP(面向切面编程)用于分离横切关注点。
- Spring AOP使用代理模式实现,包括JDK动态代理和CGLIB代理。
6. @Transactional
的工作原理
- 解析事务属性。
- 生成代理对象,包含事务拦截器。
- 事务拦截器管理事务的开启、执行和提交/回滚。
7. @Transactional
失效情况
- 自调用:同一类内部方法调用不会触发代理逻辑。
- 非public方法:代理只能拦截public方法。
- 配置不正确:未启用注解驱动的事务管理。