@Transactional 事务注解详解

如题所述

先来了解一下Spring事务的传播行为。传播行为在开始当前事务前,如果已有事务上下文存在,会决定事务性方法的执行方式。TransactionDefinition中定义了几个表示传播行为的常量。

接着,我们来说说Spring事务的回滚机制。默认情况下,Spring的AOP(声明式事务管理)针对的是unchecked exception的回滚。事务边界始于调用业务方法之前,业务方法执行完毕后,根据是否抛出runtimeException来决定commit或rollback。

如果你在方法中使用了try{}catch(Exception e){}进行异常处理,那么try代码块就会脱离事务管理。要使事务生效,需要在catch中抛出新的RuntimeException。这是面试中常被问到的事务失效场景。

@Transactional注解的底层实现方式主要是通过动态代理,代理可以是JDK的或CGLIB的。实现原理是通过代理对象在目标对象前后进行方法增强,完成事务的开启、提交和回滚。然而,需要注意的是,在@Transactional注解的方法中调用同一类中的其他方法,注解并不会生效。这个问题可以通过获取代理对象并调用目标方法来解决。

方法必须为public修饰符,因为JVM的动态代理基于接口实现,需要访问权限。如果不遵循这一点,可能会导致注入的bean获取失败,出现空指针错误。使用@EnableAspectJAutoProxy(exposeProxy = true)注解并在启动类上开启AOP,可以解决代理问题。此外,代理调用的方法同样需要public修饰符。

在控制器中调用服务层的方法,服务层通过接口实现对事务的控制。在实现类中,对各种情况的描述都以图片形式呈现,便于阅读和理解。无论是否使用代理调用方法1和方法2,只要方法transactionalMethod上具有注解,整个事务逻辑保持一致性。

想要方法1和方法2各自保持事务一致性,需要使用代理调用实现,确保方法1和方法2分别开启新的事务。通过图片展示的两种情况,方法1和方法2都在各自事务中,确保了事务的一致性。

进行进一步优化时,可以在transactionalMethod方法中分别控制方法1和方法2。这样可以将事务管理的细节进行细化,提高代码的灵活性和可维护性。

总结一下,@Transactional注解确保每个方法处于同一事务中,且在try块中必须在catch中抛出运行时异常来维持事务一致性。方法需要使用public修饰符,否则注解不生效。此外,代理调用的限制和解决方法也值得注意。

最后,分享一份大厂面试手册,包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题,非常实用。这份手册由大彬精心整理,可以帮助你更好地准备面试。

需要的小伙伴可以自行下载。

链接: mp.weixin.qq.com/s?...
温馨提示:内容为网友见解,仅供参考
无其他回答

@Transactional 事务注解详解
Transactional注解的底层实现方式主要是通过动态代理,代理可以是JDK的或CGLIB的。实现原理是通过代理对象在目标对象前后进行方法增强,完成事务的开启、提交和回滚。然而,需要注意的是,在@Transactional注解的方法中调用同一类中的其他方法,注解并不会生效。这个问题可以通过获取代理对象并调用目标方法来解决。...

Java开发必读!深入解读@Transactional事务注解
Transactional是Spring提供的一个注解,用于标识方法或类的事务属性。通过这个注解,我们可以轻松定义事务的传播行为、隔离级别、超时时间和回滚规则,从而确保操作的原子性、一致性、隔离性和持久性(ACID)。2. 使用场景 Transactional适用于需要事务管理的操作,如银行转账、订单处理等。它可以应用于方法级别和...

@Transactional 详解
1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用 2. @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读) 3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)...

【Spring基础系列4】注解@Transactional
本文主要深入讲解Spring中的@Transactional注解,包括其基本概念、使用方法以及几种可能导致事务不生效的情况。之前已经介绍了Spring的基础知识和常用注解,@Transactional注解作为补充,由于其重要性和易踩坑点,故单独进行详细阐述。为了更直观地展示@Transactional的特性,本文将配合大量示例,这些示例基于Mysql和I...

@Transactional事务不生效以及注解实现剖析
对于@Transactional注解的解析流程,首先在Spring配置文件中解析注解,通过命名空间处理器TxNamespaceHandler实现解析。接着,解析器AnnotationDrivenBeanDefinitionParser负责解析注解的mode属性,通常默认为"proxy"。InfrastructureAdvisorAutoProxyCreator类实现代理创建逻辑,根据解析出的事务属性,创建代理类以实现事务...

Spring事务注解@Transactional原理解析
在使用`@Transactional`注解时,需要关注其属性的含义,包括`propagation`和`isolation`。`propagation`属性定义了事务的传播行为,如是否需要新事务、是否在当前事务中进行等。`isolation`属性则决定了事务的隔离级别,确保不同事务之间数据的一致性。进一步深入了解`@Transactional`注解的实现细节,可参阅Spring...

java长事务的@Transactional 详解
Java中,通过@Transactional注解进行的事务管理通常被称为声明式事务。这个注解本质上是通过AOP(面向切面编程)在目标方法执行前后进行拦截,确保事务的开始、执行和管理。Spring在检测到@Transactional时,会自动获取数据库连接,开启事务,并将其绑定到ThreadLocal中。然而,如果方法中包含耗时操作,如第三方...

阿里一面 五问 @Transactional
阿里一面深入解析@Transactional:事务管理的关键注解 1. 作用范围:@Transactional 注解能用于方法级别,用于标记哪些方法需要事务管理,尤其在多数据源场景下,指定事务管理器至关重要。2. 属性详解: - rollbackFor:定义可导致事务回滚的异常类,如定义了ServletException,将回滚所有匹配javax.servlet....

@Transactional注解使用的正确姿势
1. 方法抛出运行时异常,事务正常回滚。2. 方法抛出非运行时异常,事务失效。3. 方法内捕获异常,事务失效。4. 指定要回滚的非运行时异常,事务可以正常回滚。5. 保护、默认、私有修饰符的方法,@Transactional注解无效,仅public修饰的方法有效。6. 未标注事务支持的方法调用标注了事务的方法,事务失效...

Spring Boot之@Transactional注解实践
在Spring Boot的世界里,@Transactional注解是进行事务管理的得力工具。这个注解的使用涉及到多个关键属性,如隔离级别、回滚条件、只读事务和事务传播行为。默认情况下,它支持回滚RuntimeException和Error类及其子类,但可通过配置来定制回滚条件或排除某些异常。隔离级别通过isolation属性设置,允许你选择默认的...

相似回答
大家正在搜