成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你有思考過@Transactional事務(wù)是真的好用嗎?

開發(fā) 前端
實(shí)際上,若對(duì)阿里巴巴發(fā)布的Java開發(fā)手冊(cè)有過深入研讀,便會(huì)發(fā)現(xiàn)其中很多規(guī)約非常珍貴,有些內(nèi)容可能不易理解,甚至顯得有些生硬。然而,這些規(guī)范實(shí)則由無數(shù)開發(fā)者在實(shí)戰(zhàn)中摸爬滾打后總結(jié)而來。其實(shí)有些東西都是實(shí)踐出真知。

事務(wù)管理在系統(tǒng)開發(fā)中舉足輕重,Spring提供了精妙細(xì)膩的事務(wù)管理機(jī)制,主要分為編程式事務(wù)和聲明式事務(wù)兩大架構(gòu)。

關(guān)于事務(wù)的根本概念,包括事務(wù)的本質(zhì)、數(shù)據(jù)庫中的事務(wù)特性以及Spring事務(wù)的ACID屬性、隔離級(jí)別、傳播規(guī)則和行為方式等,本文將不做深入探討。我也相信讀者對(duì)此有一定的了解。

筆者將以簡(jiǎn)潔方式闡述聲明式事務(wù)和編程式事務(wù)的概念,隨后探討筆者不推崇使用聲明式事務(wù)的理由。

編程式事務(wù)

借助底層API,如PlatformTransactionManager、TransactionDefinition和TransactionTemplate等核心接口,開發(fā)者能夠以編程的方式精準(zhǔn)地進(jìn)行事務(wù)管理。

在編程式事務(wù)模式中,開發(fā)者需在代碼中手動(dòng)管理事務(wù)的啟動(dòng)、提交和回滾等操作。

偽代碼:

public void test() {
    TransactionDefinition definition = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(definition);

    try {
        // 執(zhí)行事務(wù)操作
        // 提交事務(wù)
        transactionManager.commit(status);
    } catch (DataAccessException e) {
        // 回滾事務(wù)
        transactionManager.rollback(status);
        throw e;
    }
}

如以上代碼,開發(fā)者可以通過API自己控制事務(wù)。

聲明式事務(wù)

聲明式事務(wù)管理方式允許開發(fā)者在配置的指引下進(jìn)行事務(wù)管理,無需直接操作底層API進(jìn)行硬編碼。開發(fā)者可以通過注解或基于配置的XML來便捷地管理事務(wù)。

@Transactional
public void test() {
    // 執(zhí)行事務(wù)操作  
}

如上使用@Transactional注解即可為test方法添加事務(wù)控制。

當(dāng)然,以上代碼只是簡(jiǎn)化的版本,實(shí)際使用事務(wù)還需要進(jìn)行一些配置。這里不展開詳細(xì)說明。

這兩種事務(wù)管理方式各有優(yōu)缺點(diǎn),所適用的場(chǎng)景也各有不同。為什么有人會(huì)拒絕使用聲明式事務(wù)呢?

聲明式事務(wù)的優(yōu)點(diǎn)

通過上面的例子,我們很容易看出聲明式事務(wù)的優(yōu)點(diǎn):它幫助我們節(jié)省大量代碼,自動(dòng)處理事務(wù)啟動(dòng)、提交和回滾等操作,使開發(fā)人員擺脫繁瑣的事務(wù)管理工作。

聲明式事務(wù)管理是通過AOP實(shí)現(xiàn)的,其本質(zhì)是在目標(biāo)方法執(zhí)行前后進(jìn)行攔截。在執(zhí)行方法之前創(chuàng)建或加入一個(gè)事務(wù),在方法執(zhí)行結(jié)束后根據(jù)情況選擇提交或回滾事務(wù)。

這種方式不會(huì)對(duì)代碼造成侵入性,方法內(nèi)只需編寫業(yè)務(wù)邏輯即可。

然而,是否聲明式事務(wù)就一定完美無缺呢?未必如此。

聲明式事務(wù)的粒度問題

首先,聲明式事務(wù)存在一個(gè)限制,即其最小作用粒度應(yīng)為方法級(jí)別。

換言之,若想向某段代碼塊添加事務(wù),就需要將該代碼塊獨(dú)立出來作為一個(gè)獨(dú)立方法。

然而,正是由于這個(gè)粒度問題,我個(gè)人并不贊成過度使用聲明式事務(wù)。注意是不建議過度使用,是過度使用

首先,由于聲明式事務(wù)通常是通過注解或配置實(shí)現(xiàn)的,這可能導(dǎo)致一個(gè)問題,即開發(fā)者有可能忽略了該事務(wù)。

事務(wù)被忽略會(huì)帶來什么問題呢?

首先,如果開發(fā)者未注意到某個(gè)方法被包裹在事務(wù)中,就可能在方法內(nèi)執(zhí)行諸如RPC遠(yuǎn)程調(diào)用、消息發(fā)送、緩存更新、文件寫入等操作。

我們知道,這些操作本身無法回滾,這會(huì)導(dǎo)致數(shù)據(jù)不一致。

  • 例如,RPC調(diào)用成功但本地事務(wù)回滾,此時(shí)RPC調(diào)用無法回滾。
  • 其次,在事務(wù)中存在遠(yuǎn)程調(diào)用將延長(zhǎng)整個(gè)事務(wù)周期。若這種操作過于頻繁,可能導(dǎo)致數(shù)據(jù)庫連接池耗盡。
  • 有時(shí),即使沒有遠(yuǎn)程操作,某些人可能會(huì)不經(jīng)意地進(jìn)行一些內(nèi)存操作或運(yùn)算。或者在分庫分表情況下,可能會(huì)意外執(zhí)行跨庫操作。

相比之下,如果使用編程式事務(wù),業(yè)務(wù)代碼將清晰表示何處啟動(dòng)、提交和回滾事務(wù)。這樣,修改代碼時(shí),開發(fā)人員將被迫考慮所添加代碼是否應(yīng)該處于事務(wù)內(nèi)。

有人或許會(huì)認(rèn)為已經(jīng)存在聲明式事務(wù),但是開發(fā)人員未留意,這該責(zé)怪誰。

盡管如此說,我們?nèi)韵Mㄟ^一些機(jī)制或規(guī)范,減少此類問題發(fā)生的可能性。

例如,建議大家使用編程式事務(wù)而非聲明式事務(wù)。我在多年的工作中多次遇到開發(fā)者未留意聲明式事務(wù)而導(dǎo)致故障。

因?yàn)橛袝r(shí),聲明式事務(wù)確實(shí)不夠顯著。

聲明式事務(wù)若用錯(cuò)易失效

除了事務(wù)粒度問題外,聲明式事務(wù)還存在另一主要問題,即使看似簡(jiǎn)化了大量代碼,一旦使用不當(dāng),便很容易導(dǎo)致事務(wù)失效。

以下幾種情景可能導(dǎo)致聲明式事務(wù)失效:

  1. 將 @Transactional 應(yīng)用于非公有(non-public)方法
  2. @Transactional 注解中的 propagation 屬性設(shè)置錯(cuò)誤
  3. @Transactional 注解中的 rollbackFor 屬性設(shè)置錯(cuò)誤
  4. 同一類中的方法調(diào)用會(huì)使 @Transactional 失效
  5. 異常被捕獲導(dǎo)致 @Transactional 失效
  6. 數(shù)據(jù)庫引擎不支持事務(wù)

經(jīng)歷過聲明式事務(wù)失效問題

我們團(tuán)隊(duì)不止一次遭遇聲明式事務(wù)失效的情況。或許您也曾有此經(jīng)歷,我是深受其害的一位。

由于Spring事務(wù)基于AOP實(shí)現(xiàn),在編碼中,我們可能涉及多個(gè)切面,這些切面各自處理不同事務(wù),相互影響。

在之前的一個(gè)項(xiàng)目中,我曾發(fā)現(xiàn)我們的Service層事務(wù)全部失效,一旦SQL操作失敗未能回滾。我們追查后才發(fā)現(xiàn),是因?yàn)橐晃煌绿砑恿艘粋€(gè)切面,其中實(shí)施了異常統(tǒng)一捕獲,導(dǎo)致事務(wù)切面無法捕獲異常,從而無法回滾事務(wù)。

此類問題不僅一次發(fā)生,而且難以察覺。

許多人可能會(huì)辯解,畢竟問題源于自身能力不足,對(duì)事務(wù)理解還不夠透徹,因此出現(xiàn)誤用。

然而,我依舊堅(jiān)持認(rèn)為,我們確實(shí)無法期望每個(gè)人都具備高超技能,也不可能要求所有開發(fā)者都能百分之百避免錯(cuò)誤。我們能做的,是盡力通過機(jī)制或規(guī)范,減少或降低此類問題的發(fā)生幾率。

實(shí)際上,若對(duì)阿里巴巴發(fā)布的Java開發(fā)手冊(cè)有過深入研讀,便會(huì)發(fā)現(xiàn)其中很多規(guī)約非常珍貴,有些內(nèi)容可能不易理解,甚至顯得有些生硬。然而,這些規(guī)范實(shí)則由無數(shù)開發(fā)者在實(shí)戰(zhàn)中摸爬滾打后總結(jié)而來。其實(shí)有些東西都是實(shí)踐出真知。

關(guān)于@Transactional的用法,規(guī)約中也有提到過,只不過規(guī)約中的觀點(diǎn)沒有我這么鮮明。

文章最后

最后,本文觀點(diǎn)或許不會(huì)得到所有人的認(rèn)同,很多人可能會(huì)稱:Spring官方推崇無侵入的聲明式事務(wù),你又有何資格質(zhì)疑。

老實(shí)說,初入職場(chǎng)的那幾年,我也鐘情于聲明式事務(wù),認(rèn)為其簡(jiǎn)潔、"優(yōu)雅"。覺得那些熱衷于編程式事務(wù)的前輩多此一舉,缺乏工匠精神。

然而,隨著線上遇到幾次問題后的反思,我們發(fā)現(xiàn),有時(shí)候你的代碼確實(shí)優(yōu)雅無瑕。

然而,這種優(yōu)雅也常伴隨一些副作用,并且前輩們也無法指責(zé)我,因?yàn)槲业淖龇ù_實(shí)無可指摘...

因此,有些事情,只能在切身體會(huì)后才能領(lǐng)悟。

當(dāng)然,本文并非要求每個(gè)人完全放棄聲明式事務(wù),只是提議在未來使用事務(wù)時(shí),考慮本文所提觀點(diǎn),然后自行做出選擇。

責(zé)任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2021-10-15 10:26:56

代碼項(xiàng)目Mapper

2020-09-04 16:07:28

智慧城市Quayside多倫多

2022-09-28 18:16:34

JavaJDK

2023-04-21 10:33:42

2020-09-03 06:42:12

線程安全CPU

2021-05-18 11:14:55

人臉識(shí)別人工智能技術(shù)

2023-03-07 07:50:15

Transactio事務(wù)代碼

2015-10-23 09:34:16

2019-06-14 10:56:43

JavaMaven編程語言

2010-01-15 16:45:35

C++語言

2020-04-17 14:25:22

Kubernetes應(yīng)用程序軟件開發(fā)

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2016-06-01 15:42:58

Hadoop數(shù)據(jù)管理分布式

2021-06-26 14:59:13

SpringTransaction執(zhí)行

2022-01-05 12:03:48

MySQL索引數(shù)據(jù)

2021-11-29 09:45:57

枚舉Go代碼

2020-12-24 06:00:27

Python編程語言開發(fā)

2019-10-11 14:43:55

Windows電腦硬盤分區(qū)

2023-11-28 08:25:49

分布式鎖事務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美在线观看免费观看视频 | 91精品国产色综合久久 | 成人深夜福利 | 中文字幕一二三区 | 国产高清一二三区 | 亚洲国产成人精品久久 | 久久久高清 | 成人在线电影在线观看 | 97免费视频在线观看 | 香蕉一区 | 天堂在线免费视频 | re久久| 欧美一区二区在线免费观看 | 中文字字幕一区二区三区四区五区 | 国产 日韩 欧美 制服 另类 | 性高湖久久久久久久久3小时 | 国产一区 | 国产成人精品一区二区三区在线 | 久久亚洲一区二区三 | 色妹子综合网 | 精精国产xxxx视频在线野外 | 国产高清视频在线 | 免费观看一级毛片视频 | 久久国产精品精品 | 97人人干 | av在线三级 | av看片网站| 成人av一区二区在线观看 | 亚洲成人精品视频 | 日韩爱爱网 | 久久国产精品视频 | 欧美一区二区成人 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲三区在线观看 | 亚洲一区二区三区四区五区中文 | 日韩在线观看一区二区三区 | 国产区在线 | 日本一区视频在线观看 | japanhd成人 | 一区二区三区不卡视频 | 色偷偷人人澡人人爽人人模 |