当前位置:首页 > 科技  > 软件

你有思考过@Transactional事务是真的好用吗?

来源: 责编: 时间:2024-04-07 17:06:05 108观看
导读事务管理在系统开发中举足轻重,Spring提供了精妙细腻的事务管理机制,主要分为编程式事务和声明式事务两大架构。关于事务的根本概念,包括事务的本质、数据库中的事务特性以及Spring事务的ACID属性、隔离级别、传播规则和

事务管理在系统开发中举足轻重,Spring提供了精妙细腻的事务管理机制,主要分为编程式事务和声明式事务两大架构。r1528资讯网——每日最新资讯28at.com

关于事务的根本概念,包括事务的本质、数据库中的事务特性以及Spring事务的ACID属性、隔离级别、传播规则和行为方式等,本文将不做深入探讨。我也相信读者对此有一定的了解。r1528资讯网——每日最新资讯28at.com

笔者将以简洁方式阐述声明式事务和编程式事务的概念,随后探讨笔者不推崇使用声明式事务的理由。r1528资讯网——每日最新资讯28at.com

编程式事务

借助底层API,如PlatformTransactionManager、TransactionDefinition和TransactionTemplate等核心接口,开发者能够以编程的方式精准地进行事务管理。r1528资讯网——每日最新资讯28at.com

在编程式事务模式中,开发者需在代码中手动管理事务的启动、提交和回滚等操作。r1528资讯网——每日最新资讯28at.com

伪代码:r1528资讯网——每日最新资讯28at.com

public void test() {    TransactionDefinition definition = new DefaultTransactionDefinition();    TransactionStatus status = transactionManager.getTransaction(definition);    try {        // 执行事务操作        // 提交事务        transactionManager.commit(status);    } catch (DataAccessException e) {        // 回滚事务        transactionManager.rollback(status);        throw e;    }}

如以上代码,开发者可以通过API自己控制事务。r1528资讯网——每日最新资讯28at.com

声明式事务

声明式事务管理方式允许开发者在配置的指引下进行事务管理,无需直接操作底层API进行硬编码。开发者可以通过注解或基于配置的XML来便捷地管理事务。r1528资讯网——每日最新资讯28at.com

@Transactionalpublic void test() {    // 执行事务操作  }

如上使用@Transactional注解即可为test方法添加事务控制。r1528资讯网——每日最新资讯28at.com

当然,以上代码只是简化的版本,实际使用事务还需要进行一些配置。这里不展开详细说明。r1528资讯网——每日最新资讯28at.com

这两种事务管理方式各有优缺点,所适用的场景也各有不同。为什么有人会拒绝使用声明式事务呢?r1528资讯网——每日最新资讯28at.com

声明式事务的优点

通过上面的例子,我们很容易看出声明式事务的优点:它帮助我们节省大量代码,自动处理事务启动、提交和回滚等操作,使开发人员摆脱繁琐的事务管理工作。r1528资讯网——每日最新资讯28at.com

声明式事务管理是通过AOP实现的,其本质是在目标方法执行前后进行拦截。在执行方法之前创建或加入一个事务,在方法执行结束后根据情况选择提交或回滚事务。r1528资讯网——每日最新资讯28at.com

这种方式不会对代码造成侵入性,方法内只需编写业务逻辑即可。r1528资讯网——每日最新资讯28at.com

然而,是否声明式事务就一定完美无缺呢?未必如此。r1528资讯网——每日最新资讯28at.com

声明式事务的粒度问题

首先,声明式事务存在一个限制,即其最小作用粒度应为方法级别。r1528资讯网——每日最新资讯28at.com

换言之,若想向某段代码块添加事务,就需要将该代码块独立出来作为一个独立方法。r1528资讯网——每日最新资讯28at.com

然而,正是由于这个粒度问题,我个人并不赞成过度使用声明式事务。注意是不建议过度使用,是过度使用r1528资讯网——每日最新资讯28at.com

首先,由于声明式事务通常是通过注解或配置实现的,这可能导致一个问题,即开发者有可能忽略了该事务。r1528资讯网——每日最新资讯28at.com

事务被忽略会带来什么问题呢?r1528资讯网——每日最新资讯28at.com

首先,如果开发者未注意到某个方法被包裹在事务中,就可能在方法内执行诸如RPC远程调用、消息发送、缓存更新、文件写入等操作。r1528资讯网——每日最新资讯28at.com

我们知道,这些操作本身无法回滚,这会导致数据不一致。r1528资讯网——每日最新资讯28at.com

  • 例如,RPC调用成功但本地事务回滚,此时RPC调用无法回滚。
  • 其次,在事务中存在远程调用将延长整个事务周期。若这种操作过于频繁,可能导致数据库连接池耗尽。
  • 有时,即使没有远程操作,某些人可能会不经意地进行一些内存操作或运算。或者在分库分表情况下,可能会意外执行跨库操作。

相比之下,如果使用编程式事务,业务代码将清晰表示何处启动、提交和回滚事务。这样,修改代码时,开发人员将被迫考虑所添加代码是否应该处于事务内。r1528资讯网——每日最新资讯28at.com

有人或许会认为已经存在声明式事务,但是开发人员未留意,这该责怪谁。r1528资讯网——每日最新资讯28at.com

尽管如此说,我们仍希望通过一些机制或规范,减少此类问题发生的可能性。r1528资讯网——每日最新资讯28at.com

例如,建议大家使用编程式事务而非声明式事务。我在多年的工作中多次遇到开发者未留意声明式事务而导致故障。r1528资讯网——每日最新资讯28at.com

因为有时,声明式事务确实不够显著。r1528资讯网——每日最新资讯28at.com

声明式事务若用错易失效

除了事务粒度问题外,声明式事务还存在另一主要问题,即使看似简化了大量代码,一旦使用不当,便很容易导致事务失效。r1528资讯网——每日最新资讯28at.com

以下几种情景可能导致声明式事务失效:r1528资讯网——每日最新资讯28at.com

  1. 将 @Transactional 应用于非公有(non-public)方法
  2. @Transactional 注解中的 propagation 属性设置错误
  3. @Transactional 注解中的 rollbackFor 属性设置错误
  4. 同一类中的方法调用会使 @Transactional 失效
  5. 异常被捕获导致 @Transactional 失效
  6. 数据库引擎不支持事务

经历过声明式事务失效问题

我们团队不止一次遭遇声明式事务失效的情况。或许您也曾有此经历,我是深受其害的一位。r1528资讯网——每日最新资讯28at.com

由于Spring事务基于AOP实现,在编码中,我们可能涉及多个切面,这些切面各自处理不同事务,相互影响。r1528资讯网——每日最新资讯28at.com

在之前的一个项目中,我曾发现我们的Service层事务全部失效,一旦SQL操作失败未能回滚。我们追查后才发现,是因为一位同事添加了一个切面,其中实施了异常统一捕获,导致事务切面无法捕获异常,从而无法回滚事务。r1528资讯网——每日最新资讯28at.com

此类问题不仅一次发生,而且难以察觉。r1528资讯网——每日最新资讯28at.com

许多人可能会辩解,毕竟问题源于自身能力不足,对事务理解还不够透彻,因此出现误用。r1528资讯网——每日最新资讯28at.com

然而,我依旧坚持认为,我们确实无法期望每个人都具备高超技能,也不可能要求所有开发者都能百分之百避免错误。我们能做的,是尽力通过机制或规范,减少或降低此类问题的发生几率。r1528资讯网——每日最新资讯28at.com

实际上,若对阿里巴巴发布的Java开发手册有过深入研读,便会发现其中很多规约非常珍贵,有些内容可能不易理解,甚至显得有些生硬。然而,这些规范实则由无数开发者在实战中摸爬滚打后总结而来。其实有些东西都是实践出真知。r1528资讯网——每日最新资讯28at.com

关于@Transactional的用法,规约中也有提到过,只不过规约中的观点没有我这么鲜明。r1528资讯网——每日最新资讯28at.com

文章最后

最后,本文观点或许不会得到所有人的认同,很多人可能会称:Spring官方推崇无侵入的声明式事务,你又有何资格质疑。r1528资讯网——每日最新资讯28at.com

老实说,初入职场的那几年,我也钟情于声明式事务,认为其简洁、"优雅"。觉得那些热衷于编程式事务的前辈多此一举,缺乏工匠精神。r1528资讯网——每日最新资讯28at.com

然而,随着线上遇到几次问题后的反思,我们发现,有时候你的代码确实优雅无瑕。r1528资讯网——每日最新资讯28at.com

然而,这种优雅也常伴随一些副作用,并且前辈们也无法指责我,因为我的做法确实无可指摘...r1528资讯网——每日最新资讯28at.com

因此,有些事情,只能在切身体会后才能领悟。r1528资讯网——每日最新资讯28at.com

当然,本文并非要求每个人完全放弃声明式事务,只是提议在未来使用事务时,考虑本文所提观点,然后自行做出选择。r1528资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-81737-0.html你有思考过@Transactional事务是真的好用吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一起聊聊在Rust中使用枚举表示状态

下一篇: SpringSecurity保护了什么?你知道吗?

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 十个简单但很有用的Python装饰器

    十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top