@Transactional
注解的原理主要涉及以下几个方面,我将根据提供的参考文章,用清晰、分点的方式解释其原理:
- 概念与目的:
@Transactional
是Spring框架提供的一个用于声明式事务管理的注解。- 它方便我们管理事务,保证数据的一致性与可靠性。
- 事务的基本特性:
- 原子性(Atomicity):事务是一个整体,要么全部执行,要么全部不执行(回滚)。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变到另一个一致性状态。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。
- 持久性(Durability):一旦事务提交,它对数据库中数据的改变就是永久性的。
- @Transactional 的使用:
- 只能用在public方法上,如果用在protected或private方法上,不会报错但注解不会生效。
- 默认情况下,事务遇到
RuntimeException
时会回滚,遇到受检查的异常则不会回滚。 - 可以通过
rollbackFor
属性来定义回滚的异常类型。 propagation
属性定义了事务的传播行为。
- 实现原理:
@Transactional
注解是通过JDBC的事务 + Spring的AOP(面向切面编程)动态代理来完成的。- 基于AOP面向切面,它将具体业务与事务处理部分解耦,代码侵入性很低。
- 事务开始时,通过AOP机制,生成一个代理
connection
对象,并将其放入DataSource
实例的某个与DataSourceTransactionManager
相关的容器中。 - 在整个事务中,客户代码都应该使用该
connection
连接数据库,执行所有数据库命令。 - 事务结束时,回滚在第1步骤中得到的代理
connection
对象上执行的数据库命令,然后关闭该代理connection
对象。
- 事务的隔离级别:
@Transactional
注解支持设置事务的隔离级别,类似于MySQL的隔离级别,不同的级别安全性不同。
- 配置与注入:
- 在Spring启动时,会解析生成相关的bean,查看拥有
@Transactional
注解的类和方法,并为它们生成代理。 - 根据
@Transactional
的相关参数进行配置注入,在代理中处理相关的事务逻辑(如开启、提交或回滚事务)。
- 在Spring启动时,会解析生成相关的bean,查看拥有
- 性能与系统设计:
- 将
@Transactional
注解放置在需要进行事务管理的方法上,而不是所有接口实现类上,以减少不必要的AOP拦截和事务处理,从而提高系统性能。
- 将
综上所述,@Transactional
注解通过Spring的AOP机制,结合JDBC事务,为开发者提供了一种方便、灵活的事务管理方式,帮助开发者更好地管理数据的一致性和可靠性。