网易首页 > 网易号 > 正文 申请入驻

技术大咖们都在关注的话题, 阿里巴巴面试中的@Transactional

0
分享至


嗨,大家好,我是小米!今天我要和大家聊一聊一个在阿里巴巴面试中常被问到的话题:@Transactional注解。作为一个喜欢分享技术的小伙伴,我希望通过这篇文章,能够帮助大家更好地理解和应用这个关键的技术点。

@EnableTransactionManagement

在开始讨论@Transactional之前,首先我们来看看@EnableTransactionManagement注解。这个注解在Spring框架中扮演着关键的角色,它是启用注解驱动的事务管理功能的入口点。要深入了解这个注解,我们需要仔细研究其源代码,并理解它的实现原理。

首先,我们来看看@EnableTransactionManagement注解的定义。在Spring源代码中,它实际上是一个组合注解,包含了@Import@Transactional注解。@Import注解的作用是将指定的配置类导入到当前配置类中,而@Transactional注解则表示启用基于注解的事务管理。


@EnableTransactionManagement注解的实现中,最重要的部分是TransactionManagementConfigurationSelector类。这个类实现了ImportSelector接口,负责根据注解的属性配置来选择合适的配置类导入到Spring容器中。


selectImports方法中,TransactionManagementConfigurationSelector根据注解的属性配置,选择合适的配置类导入。其中,如果我们没有显式地指定事务管理器的类型,它会根据当前环境中的Bean定义来自动选择一个合适的事务管理器。

另外,@EnableTransactionManagement注解还支持配置mode属性,用来指定事务的模式。默认情况下,它是AdviceMode.PROXY,表示使用代理模式来管理事务。除此之外,还可以配置成AdviceMode.ASPECTJ,表示使用AspectJ切面来管理事务。


@Transactional

@Transactional注解在Spring中扮演着关键的角色,它负责管理事务的生命周期,确保数据操作的一致性和完整性。让我们来揭开这个注解背后的神秘面纱,从源代码的角度来探索其工作原理。

首先,我们来看看@Transactional注解的定义。在Spring源代码中,它实际上是一个元注解,即一个用于修饰其他注解的注解。通过@Transactional注解,我们可以将事务管理应用到方法或类级别。


@Transactional注解的实现中,最核心的部分是其对应的事务增强器(TransactionInterceptor)。事务增强器是一个拦截器,它负责在方法调用前后添加事务管理逻辑。当一个被@Transactional注解修饰的方法被调用时,事务增强器会根据注解的属性配置来决定事务的行为,例如事务的传播属性、隔离级别、超时时间等。


invoke方法中,事务增强器会在方法调用前后分别执行TransactionAspectSupport中定义的invokeWithinTransaction方法,来实现事务的开启、提交或回滚等操作。通过这种方式,@Transactional注解能够确保被修饰方法的数据操作在事务的保护下进行,保证数据的一致性和完整性。

除了事务增强器,@Transactional注解的实现还涉及到事务管理器(PlatformTransactionManager)等核心组件。事务管理器负责管理事务的生命周期,包括事务的开启、提交、回滚等操作。

事务传播属性

在使用@Transactional注解时,我们经常需要指定事务的传播属性。事务传播属性定义了事务在不同调用之间如何传播。下面是几种常见的事务传播属性:

REQUIRED:表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播属性,也是最常用的一种。当我们需要确保某个方法在事务的保护下执行,并且希望它能够参与到已存在的事务中时,就可以选择使用REQUIRED传播属性。

MANDATORY:表示当前方法必须在一个已存在的事务中执行,否则将抛出异常。这种传播属性通常用于要求某些方法必须在事务的上下文中被调用,例如在一些事务管理的框架或库中,可能会要求一些方法必须在事务的控制下执行。

NEVER:表示当前方法不能在事务中执行,如果当前存在事务,则抛出异常。这种传播属性通常用于要求某些方法不应该在事务的上下文中执行,例如在某些特定的业务场景下,我们可能希望某些操作不受事务的影响。

NOT_SUPPORTED:表示当前方法不应在事务中执行,如果当前存在事务,则将其挂起。这种传播属性通常用于要求某些方法在不受事务管理的情况下执行,例如在一些与事务无关的操作中,我们可以选择使用NOT_SUPPORTED传播属性。

REQUIRES_NEW:表示当前方法应该创建一个新的事务,即使已经存在事务也应该将其挂起。这种传播属性通常用于要求某些方法在一个新的事务中执行,而不受外部事务的影响。

SUPPORTS:表示当前方法支持当前事务,如果当前没有事务,则以非事务方式执行。这种传播属性通常用于要求某些方法可以选择参与到已存在的事务中,但如果没有事务也可以独立执行。

NESTED:表示当前方法应该在一个嵌套的事务中执行;如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与REQUIRED类似的操作。这种传播属性通常用于要求某些方法在一个嵌套的事务中执行,而不受外部事务的影响。

如何选择合适的传播属性?

在实际开发中,我们需要根据具体的业务需求和场景来选择合适的事务传播属性。例如,如果我们希望某个方法参与到已存在的事务中,可以选择使用REQUIRED传播属性;如果希望某个方法必须在事务的上下文中执行,可以选择使用MANDATORY传播属性。

总的来说,正确选择事务传播属性对于确保数据操作的一致性和完整性非常重要,需要充分考虑各种因素并结合实际情况做出合适的决策。

注意事项

在使用@Transactional注解时,有一些重要的注意事项需要我们特别关注,以避免出现意外情况或性能问题。以下是一些常见的注意事项:

事务函数中不要处理耗时任务:在事务函数中处理耗时任务可能会导致长期占有数据库连接,从而影响系统的性能表现。因此,应该尽量避免在事务函数中处理耗时任务,特别是在高并发环境下,这可能导致数据库连接池资源被耗尽,影响系统的稳定性。

事务函数中不要处理无关业务:在事务函数中处理无关业务可能会增加出现异常的风险,导致事务回滚。事务回滚会影响其他正常业务的执行,因此应该尽量避免在事务函数中处理与事务无关的业务。如果确实需要处理其他业务,应该考虑将其放在事务之外进行处理,以降低出现异常的影响范围。

合理设置事务的范围和粒度:在设计事务时,应该根据业务需求和数据操作的复杂性来合理设置事务的范围和粒度。过大的事务范围可能会导致事务持有锁的时间过长,影响并发性能;而过小的事务粒度可能会增加事务管理的开销,降低系统的性能表现。因此,需要根据具体情况权衡利弊,选择合适的事务范围和粒度。

注意事务的隔离级别:在使用事务管理时,需要特别注意事务的隔离级别。不同的隔离级别会对数据库的并发性能和数据一致性产生不同的影响。因此,在设计事务时,需要根据业务需求和系统性能要求来选择合适的隔离级别,并进行必要的测试和性能调优。

总的来说,@Transactional注解是Spring框架中非常重要的一个注解,能够帮助我们管理事务,保证数据的一致性和完整性。但是在使用时,我们需要注意事务的传播属性和一些注意事项,以避免出现意外情况。希望通过今天的分享,能够帮助到大家更好地理解和应用@Transactional注解。如果你有什么疑问或者想法,欢迎在下方留言,让我们一起讨论交流吧!

最后,祝大家学习进步,工作顺利!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
王毅再任外交部长,正告美国“硬骨头”,未来谁能担任他的职务

王毅再任外交部长,正告美国“硬骨头”,未来谁能担任他的职务

李昕言温度空间
2024-04-27 17:07:54
网上这两天出现一股声音:说昆明人少了,到处冷冷清清

网上这两天出现一股声音:说昆明人少了,到处冷冷清清

童童聊娱乐啊
2024-04-28 16:09:38
俄罗斯卖中国石油4041元,美国卖我们是多少?一对比就知道谁黑心

俄罗斯卖中国石油4041元,美国卖我们是多少?一对比就知道谁黑心

农村阿祖
2024-04-28 08:00:10
复盘阿森纳3-2热刺:阵容优势助枪手领先,激进策略助热刺险逆转

复盘阿森纳3-2热刺:阵容优势助枪手领先,激进策略助热刺险逆转

里芃芃体育
2024-04-29 01:00:03
周鸿祎突发怪病,发病前一天,他曾在车展上喝过陌生女子递来的水

周鸿祎突发怪病,发病前一天,他曾在车展上喝过陌生女子递来的水

剑齿猫de动物志
2024-04-28 02:55:56
萨拉赫暗示,如果与克洛普的紧张关系公开,将会出现“大问题”

萨拉赫暗示,如果与克洛普的紧张关系公开,将会出现“大问题”

星耀国际足坛
2024-04-28 12:26:25
按摩时,足浴技师问你“之前来过么?”可能在暗示你,别不当回事

按摩时,足浴技师问你“之前来过么?”可能在暗示你,别不当回事

毒舌混知所
2024-03-30 07:50:03
上海85岁老太倒地1小时没人扶,不料送去医院后,竟赖上小护士

上海85岁老太倒地1小时没人扶,不料送去医院后,竟赖上小护士

腊五
2024-04-28 22:26:49
距离300公里,周杰伦和蔡依林同频唱哭3亿人:时隔23年依旧意难平

距离300公里,周杰伦和蔡依林同频唱哭3亿人:时隔23年依旧意难平

阿甘笔记
2024-04-26 12:03:47
一个月把肝养好,根据肝脏发出的求救信号来养肝!

一个月把肝养好,根据肝脏发出的求救信号来养肝!

今日养生之道
2024-04-25 20:41:03
上海警方开展“砺剑2024”第九次集中清查整治行动

上海警方开展“砺剑2024”第九次集中清查整治行动

东方网
2024-04-28 16:39:09
大降价就是好卖!奥迪A6L下跌幅度达11.6万,一个月卖了16505辆

大降价就是好卖!奥迪A6L下跌幅度达11.6万,一个月卖了16505辆

户外小阿隋
2024-04-28 21:36:32
高人预测:若不出意外的话,明年2025年将会有以下10个社会现象

高人预测:若不出意外的话,明年2025年将会有以下10个社会现象

影孖看世界
2024-04-27 20:35:52
林彪的最后24小时:秘书李文普不愿当叛徒,中途跳车遭林立果枪击

林彪的最后24小时:秘书李文普不愿当叛徒,中途跳车遭林立果枪击

拙言问史
2024-04-25 17:15:21
特斯拉FSD入华迎利好,已通过国家汽车数据安全4项全部要求

特斯拉FSD入华迎利好,已通过国家汽车数据安全4项全部要求

环球网资讯
2024-04-28 22:49:42
刘晓庆撞衫朱琳,一个刻意扮嫩,一个优雅知性,同岁气质差距立显

刘晓庆撞衫朱琳,一个刻意扮嫩,一个优雅知性,同岁气质差距立显

顶牌故事会
2024-04-27 10:46:47
迪丽热巴美哭了

迪丽热巴美哭了

娱乐的小灶
2024-04-28 15:33:16
一千公里高速开100和120用时会差多少?很多人不清楚,告诉你答案

一千公里高速开100和120用时会差多少?很多人不清楚,告诉你答案

户外小阿隋
2024-04-28 11:30:20
“炎症”拖成癌!哈佛推荐:5种果蔬打成汁,每天半杯,降低50%炎症反应

“炎症”拖成癌!哈佛推荐:5种果蔬打成汁,每天半杯,降低50%炎症反应

凤凰卫视
2024-04-26 16:33:12
这4大生肖惹不起,暴脾气,财运却很旺,一辈子常有发的机会!

这4大生肖惹不起,暴脾气,财运却很旺,一辈子常有发的机会!

书中自有颜如玉
2024-04-27 17:07:03
2024-04-29 01:24:49
匆匆的娱乐
匆匆的娱乐
一起来分享娱乐
1356文章数 4916关注度
往期回顾 全部

科技要闻

特斯拉生死时速,马斯克西天取经

头条要闻

媒体:福建舰再"现身" 舰载机模型上甲板释放重要信号

头条要闻

媒体:福建舰再"现身" 舰载机模型上甲板释放重要信号

体育要闻

湖人的G4,尽人事得到了回报

娱乐要闻

张杰谢娜发文为何炅庆生,亲如家人!

财经要闻

上财万字报告深度解读Q1经济

汽车要闻

鸿蒙首款行政旗舰轿车 华为享界S9实车亮相车展

态度原创

房产
本地
健康
公开课
军事航空

房产要闻

力度越来越大!落户两年享本地居民购房政策,海南第16城松绑限购!

本地新闻

云游中国|苗族蜡染:九黎城的“潮”文化

春天野菜不知不识莫乱吃

公开课

父亲年龄越大孩子越不聪明?

军事要闻

也门胡塞击落美军"死神"无人机 并展示残骸

无障碍浏览 进入关怀版