事务注解的本质是什么?
1 个回答
用眼睛是看不到事物的本质的,只有心灵才能够洞察一切。铁血无双### 事务注解的本质 `@Transactional` 注解在 Spring 中用于声明式事务管理,其本质是一些与事务相关的元数据。这些元数据在运行时被事务基础设施读取和使用,以配置 Bean 的事务行为。具体来说,`@Transactional` 注解具有以下功能: 1. **声明参与事务** - **作用**:表明该方法或类中的方法要参与事务。 - **应用**:通过 `@Transactional` 注解,开发者可以明确哪些方法需要事务支持。 2. **配置事务属性** - **作用**:通过注解属性配置事务的参与方式和运行行为,包括事务的传播方式、隔离级别、超时时间和回滚规则等。 - **应用**:在注解中设置不同的属性值,以定制事务的具体行为。 ### 实现机制 声明式事务主要得益于 Spring AOP(面向切面编程)。Spring 使用一个事务拦截器,在方法调用的前后或周围进行事务性增强(advice),以驱动事务的完成。 #### 主要步骤 1. **注解解析** - Spring 在启动时会解析 `@Transactional` 注解,获取其中的元数据。 - 这些元数据包括事务的传播方式、隔离级别、超时时间、只读属性和回滚规则等。 2. **AOP 拦截** - Spring 使用 AOP 拦截器拦截标注了 `@Transactional` 的方法调用。 - 在方法调用前,拦截器会检查是否需要启动新的事务或加入现有事务。 3. **事务增强** - 在方法执行前,事务拦截器会根据元数据启动事务。 - 在方法执行后,根据执行结果决定是提交还是回滚事务。 ### 注解应用 - **类级别注解** - 当 `@Transactional` 注解标注在类上时,默认应用到类中的所有方法。 - 如果方法上也标注了 `@Transactional`,则方法上的注解优先级更高。 - **示例**: ```java @Transactional public class MyService { public void method1() { // 参与事务 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void method2() { // 使用新的事务 } } ``` - **方法级别注解** - 当 `@Transactional` 注解标注在方法上时,只对该方法生效。 - **示例**: ```java public class MyService { @Transactional public void method1() { // 参与事务 } public void method2() { // 不参与事务 } } ``` ### 注意事项 - **访问修饰符**:`@Transactional` 注解的方法必须是 `public` 的,因为 Spring AOP 默认使用动态代理,代理对象只能拦截 `public` 方法。 - **自调用问题**:在同一个类中自调用另一个带有 `@Transactional` 注解的方法时,事务不会生效,因为自调用不会触发 AOP 代理。 ### 总结 - `@Transactional` 注解通过元数据声明事务的参与和配置事务属性。 - 事务的实现机制依赖于 Spring AOP,通过事务拦截器在方法调用的前后进行增强。 - `@Transactional` 注解可以标注在类或方法上,方法上的注解优先级更高。 - 需要注意方法的访问修饰符和自调用问题,确保事务能够正确生效。发布于 2024-07-26 14:34 •IP属地 安徽举报评论收藏
公众号进入网站体验更佳

