Spring揭秘-事務(wù)管理

  1. 什么是事務(wù)?
    事務(wù)就是以可控的方式對(duì)數(shù)據(jù)資源進(jìn)行訪問的一組操作壮锻,它有四個(gè)限定屬性琐旁,原子性、一致性猜绣、隔離性灰殴、持久性,就是我們常稱的ACID屬性掰邢。
  2. 隔離性的四種隔離級(jí)別由弱到強(qiáng)分別是Read Uncommited牺陶、Read Commited、Repeatable Read辣之、Serializable掰伸。
  • Read Uncommited
    最低的隔離級(jí)別,可以讀取到其他事務(wù)未提交的數(shù)據(jù)怀估,無(wú)法避免臟讀狮鸭,幻讀合搅,不可重復(fù)讀等問題。
    • 臟讀
      讀取到另一個(gè)事務(wù)未提交的數(shù)據(jù)歧蕉,然后那個(gè)事務(wù)回滾了灾部,那我們讀到的數(shù)據(jù)就是臟數(shù)據(jù)。
    • 不可重復(fù)讀
      在同一個(gè)事務(wù)中對(duì)同一筆數(shù)據(jù)進(jìn)行多次讀取惯退,讀取到的結(jié)果不完全相同赌髓。比如在Read Commited隔離級(jí)別,一個(gè)事務(wù)在另一個(gè)事務(wù)提交數(shù)據(jù)前讀一次蒸痹,提交后讀一次,兩次讀取的結(jié)果不一致呛哟。
    • 幻讀
      同一個(gè)事務(wù)中對(duì)多條記錄(聚合操作也算)進(jìn)行查詢結(jié)果不完全相同的情況叫幻讀叠荠,比如事務(wù)A查詢表發(fā)現(xiàn)表為空,然后準(zhǔn)備插入一個(gè)主鍵為1的數(shù)據(jù)扫责,在事務(wù)A插入之前榛鼎,事務(wù)B完成了插入主鍵為1數(shù)據(jù)的操作,在Repeatable Read級(jí)別鳖孤,事務(wù)A對(duì)B事務(wù)的插入操作不可見(因?yàn)镽epeatable Read能避免不可重復(fù)讀)者娱,但當(dāng)A事務(wù)插入數(shù)據(jù)時(shí)報(bào)錯(cuò),發(fā)現(xiàn)表里已經(jīng)有主鍵為1的數(shù)據(jù)了苏揣。
  • Read Commited
    隔離級(jí)別比Read Uncommited 高黄鳍,通常是數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別,一個(gè)事務(wù)的更新操作只有在事務(wù)提交后才能被讀取到平匈】蚬担可以避免臟讀,但無(wú)法避免幻讀和不可重復(fù)讀
  • Repeatable Read
    可重復(fù)讀增炭,它可以保證在整個(gè)事務(wù)過程中忍燥,對(duì)同一筆數(shù)據(jù)讀取的結(jié)果是相同的,不管其他事務(wù)是否對(duì)該筆數(shù)據(jù)進(jìn)行更新隙姿∶仿ⅲ可以避免臟讀和不可重復(fù)讀,但是不可避免幻讀输玷。
  • Serializable
    最為嚴(yán)格的隔離級(jí)別队丝,所以操作必須按照順序執(zhí)行,可以避免所有的問題欲鹏,但是效率最低
  1. 全局事務(wù)和局部事務(wù)
    全局事務(wù)也叫分布式事務(wù)炭玫,通過兩階段提交協(xié)調(diào)多RM(Resource Manager一般是數(shù)據(jù)庫(kù))之間的事務(wù)處理,有個(gè)非常恰當(dāng)?shù)睦邮腔槎Y上主持會(huì)分別問男女雙方你愿意嫁給他嗎貌虾?如果有任意一方拒絕吞加,就各自回滾到單身狀態(tài)。TP Monitor負(fù)責(zé)在分布式事務(wù)中協(xié)調(diào)多個(gè)RM的事務(wù)處理,TM是它的核心模塊衔憨。


    全局事務(wù)

    只有一個(gè)RM參與的就叫局部事務(wù)叶圃,它不必引進(jìn)TP Monitor,應(yīng)用程序可以直接和RM打交道践图,全局事務(wù)和局部事務(wù)的區(qū)別是涉及多少RM掺冠,如果系統(tǒng)中有多個(gè)RM,但是事務(wù)只涉及一個(gè)RM,同樣是局部事務(wù)。

  2. Spring事務(wù)


    Spring事務(wù)抽象接口關(guān)系圖
  • TransactionDefinition
    TransactionDefinition定義了事務(wù)的隔離級(jí)別码党,傳播行為德崭,事務(wù)的超時(shí)時(shí)間,是否為只讀事務(wù)揖盘。
public interface TransactionDefinition {
    /*傳播行為*/
    //如果當(dāng)前存在一個(gè)事務(wù)眉厨,則加入當(dāng)前事務(wù),如果不存在兽狭,則新建一個(gè)事務(wù)憾股,至少保證在一個(gè)事務(wù)中運(yùn)行
    int PROPAGATION_REQUIRED = 0;
    //如果當(dāng)前存在一個(gè)事務(wù),則加入當(dāng)前事務(wù)箕慧,如果不存在服球,則直接執(zhí)行
    int PROPAGATION_SUPPORTS = 1;
    //強(qiáng)制要求當(dāng)前存在一個(gè)事務(wù),如果不存在則跑出異常
    int PROPAGATION_MANDATORY = 2;
    //不管當(dāng)前是否存在事務(wù)颠焦,都會(huì)創(chuàng)建新的事務(wù)斩熊,如果當(dāng)前存在事務(wù)會(huì)掛起當(dāng)前事務(wù)
    int PROPAGATION_REQUIRES_NEW = 3;
    //不支持當(dāng)前事務(wù),在沒有事務(wù)的情況下執(zhí)行伐庭,如果當(dāng)前存在事務(wù)座享,會(huì)掛起當(dāng)前事務(wù)
    int PROPAGATION_NOT_SUPPORTED = 4;
    //永遠(yuǎn)不需要當(dāng)前存在事務(wù),如果存在則拋出異常
    int PROPAGATION_NEVER = 5;
    //如果存在當(dāng)前事務(wù)似忧,則在當(dāng)前事務(wù)的一個(gè)嵌套事務(wù)中執(zhí)行
    int PROPAGATION_NESTED = 6;
    /*隔離級(jí)別*/
    //表示使用數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別
    int ISOLATION_DEFAULT = -1;
    //對(duì)應(yīng)Read_Uncommitted隔離級(jí)別渣叛,無(wú)法避免臟讀,不可重復(fù)讀和幻讀
    int ISOLATION_READ_UNCOMMITTED = 1;
    //對(duì)應(yīng)Read Committed隔離級(jí)別盯捌,無(wú)法避免不可重復(fù)讀和幻讀
    int ISOLATION_READ_COMMITTED = 2;
    //對(duì)應(yīng)Repeatable Read淳衙, 無(wú)法避免幻讀
    int ISOLATION_REPEATABLE_READ = 4;
    //對(duì)應(yīng)Serializable隔離級(jí)別,并發(fā)行最低饺著,能避免所有問題
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();

    int getIsolationLevel();

    int getTimeout();

    boolean isReadOnly();

    String getName();
}
  • PROPAGATION_SUPPORTS和PROPAGATION_NOT_SUPPORTS的區(qū)別


  • PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED的區(qū)別


  • TransactionStatus
    PlatfornTransactionManager的getTransaction會(huì)返回一個(gè)Transaction對(duì)象箫攀,可以通過它查詢事務(wù)的狀態(tài)
public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();

    boolean hasSavepoint();

    //標(biāo)記當(dāng)前事務(wù)使其回滾
    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}
  • PlatformTransactionManager
public interface PlatformTransactionManager {
    /*getTransaction會(huì)開啟一個(gè)事務(wù),但在此之前需要判斷是否存在是否幼衰,
    如果存在則根據(jù)傳播行為決定是掛起事務(wù)或者拋出異常靴跛,
    不存在事務(wù),同樣需要根據(jù)傳播行為決定如何處理*/
    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;
    /*檢測(cè)全局的rollBackOnly渡嚣,如果被設(shè)置則執(zhí)行回滾*/
    void commit(TransactionStatus var1) throws TransactionException;
    /*檢測(cè)全局的rollBackOnly梢睛,如果沒被設(shè)置則執(zhí)行提交*/
    void rollback(TransactionStatus var1) throws TransactionException;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肥印,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绝葡,更是在濱河造成了極大的恐慌深碱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏畅,死亡現(xiàn)場(chǎng)離奇詭異敷硅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愉阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門绞蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榜旦,你說我怎么就攤上這事幽七。” “怎么了章办?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵锉走,是天一觀的道長(zhǎng)滨彻。 經(jīng)常有香客問我藕届,道長(zhǎng),這世上最難降的妖魔是什么亭饵? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任休偶,我火速辦了婚禮,結(jié)果婚禮上辜羊,老公的妹妹穿的比我還像新娘踏兜。我一直安慰自己,他們只是感情好八秃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布碱妆。 她就那樣靜靜地躺著,像睡著了一般昔驱。 火紅的嫁衣襯著肌膚如雪疹尾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天骤肛,我揣著相機(jī)與錄音纳本,去河邊找鬼。 笑死腋颠,一個(gè)胖子當(dāng)著我的面吹牛繁成,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淑玫,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼巾腕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼面睛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祠墅,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侮穿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后毁嗦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲茅,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年狗准,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克锣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腔长,死狀恐怖袭祟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捞附,我是刑警寧澤巾乳,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站鸟召,受9級(jí)特大地震影響胆绊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欧募,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一压状、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跟继,春花似錦种冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至金吗,卻和暖如春十兢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辽聊。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工纪挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟匆。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓异袄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玛臂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烤蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 很多人喜歡這篇文章封孙,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,743評(píng)論 2 59
  • Spring事務(wù)機(jī)制主要包括聲明式事務(wù)和編程式事務(wù)讽营,此處側(cè)重講解聲明式事務(wù)虎忌,編程式事務(wù)在實(shí)際開發(fā)中得不到廣泛使用,...
    EnigmaXXX閱讀 668評(píng)論 0 0
  • 洛小汐閱讀 182評(píng)論 3 1
  • 今天下午我和我的好朋友思語(yǔ)和思同一起玩了一個(gè)游戲,名字叫起床游戲,游戲規(guī)則是一個(gè)人當(dāng)起床鬧鐘橱鹏,另外兩個(gè)人當(dāng)被吵醒的...
    津妍寶貝閱讀 951評(píng)論 0 1