Spring 中的事務(wù)隔離級(jí)別

什么是事務(wù)隔離級(jí)別涛漂?

事務(wù)隔離級(jí)別是對(duì)事務(wù) 4 大特性中隔離性的具體體現(xiàn)奄抽,使用事務(wù)隔離級(jí)別可以控制并發(fā)事務(wù)在同時(shí)執(zhí)行時(shí)的某種行為。
比如叫搁,有兩個(gè)事務(wù)同時(shí)操作同一張表赔桌,此時(shí)有一個(gè)事務(wù)修改了這張表的數(shù)據(jù),但尚未提交事務(wù)渴逻,那么在另一個(gè)事務(wù)中疾党,要不要(或者說能不能)看到其他事務(wù)尚未提交的數(shù)據(jù)呢?
這個(gè)問題的答案就要看事務(wù)的隔離級(jí)別了惨奕,不同的事務(wù)隔離級(jí)別雪位,對(duì)應(yīng)的行為模式也是不一樣的(有些隔離級(jí)別可以看到其他事務(wù)尚未提交的數(shù)據(jù),有些事務(wù)隔離級(jí)別看不到其他事務(wù)尚未提交的數(shù)據(jù))梨撞,這就是事務(wù)隔離級(jí)別的作用雹洗。

Spring 事務(wù)隔離級(jí)別

Sping 中的事務(wù)隔離級(jí)別有 5 種香罐,它們分別是:

  1. DEFAULT:Spring 中默認(rèn)的事務(wù)隔離級(jí)別,以連接的數(shù)據(jù)庫的事務(wù)隔離級(jí)別為準(zhǔn)队伟;
  2. READ_UNCOMMITTED:讀未提交穴吹,也叫未提交讀幽勒,該隔離級(jí)別的事務(wù)可以看到其他事務(wù)中未提交的數(shù)據(jù)嗜侮。該隔離級(jí)別因?yàn)榭梢宰x取到其他事務(wù)中未提交的數(shù)據(jù),而未提交的數(shù)據(jù)可能會(huì)發(fā)生回滾啥容,因此我們把該級(jí)別讀取到的數(shù)據(jù)稱之為臟數(shù)據(jù)锈颗,把這個(gè)問題稱之為臟讀;
  3. READ_COMMITTED:讀已提交咪惠,也叫提交讀,該隔離級(jí)別的事務(wù)能讀取到已經(jīng)提交事務(wù)的數(shù)據(jù),因此它不會(huì)有臟讀問題纲爸。但由于在事務(wù)的執(zhí)行中可以讀取到其他事務(wù)提交的結(jié)果褥琐,所以在不同時(shí)間的相同 SQL 查詢中,可能會(huì)得到不同的結(jié)果炭臭,這種現(xiàn)象叫做不可重復(fù)讀永脓;
  4. REPEATABLE_READ:可重復(fù)讀,它能確保同一事務(wù)多次查詢的結(jié)果一致鞋仍。但也會(huì)有新的問題常摧,比如此級(jí)別的事務(wù)正在執(zhí)行時(shí),另一個(gè)事務(wù)成功的插入了某條數(shù)據(jù)威创,但因?yàn)樗看尾樵兊慕Y(jié)果都是一樣的落午,所以會(huì)導(dǎo)致查詢不到這條數(shù)據(jù),自己重復(fù)插入時(shí)又失敹遣颉(因?yàn)槲ㄒ患s束的原因)溃斋。明明在事務(wù)中查詢不到這條信息,但自己就是插入不進(jìn)去吸申,這就叫幻讀 (Phantom Read)梗劫;
  5. SERIALIZABLE:串行化,最高的事務(wù)隔離級(jí)別呛谜,它會(huì)強(qiáng)制事務(wù)排序在跳,使之不會(huì)發(fā)生沖突,從而解決了臟讀隐岛、不可重復(fù)讀和幻讀問題猫妙,但因?yàn)閳?zhí)行效率低,所以真正使用的場景并不多聚凹。

所以割坠,相比于 MySQL 的事務(wù)隔離級(jí)別齐帚,Spring 中多了一種 DEFAULT 的事務(wù)隔離級(jí)別。
事務(wù)隔離級(jí)別與問題的對(duì)應(yīng)關(guān)系如下:

事務(wù)隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀未提交(READ UNCOMMITTED) ? ? ?
讀已提交(READ COMMITTED) ? ? ?
可重復(fù)讀(REPEATABLE READ) ? ? ?
串行化(SERIALIZABLE) ? ? ?
  • 臟讀:一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)修改的數(shù)據(jù)之后彼哼,后一個(gè)事務(wù)又進(jìn)行了回滾操作对妄,從而導(dǎo)致第一個(gè)事務(wù)讀取的數(shù)據(jù)是錯(cuò)誤的。
  • 不可重復(fù)讀:一個(gè)事務(wù)兩次查詢得到的結(jié)果不同敢朱,因?yàn)樵趦纱尾樵冎虚g剪菱,有另一個(gè)事務(wù)把數(shù)據(jù)修改了。
  • 幻讀:一個(gè)事務(wù)兩次查詢中得到的結(jié)果集不同拴签,因?yàn)樵趦纱尾樵冎辛硪粋€(gè)事務(wù)有新增了一部分?jǐn)?shù)據(jù)孝常。

設(shè)置事務(wù)隔離級(jí)別

在代碼中設(shè)置事務(wù)隔離級(jí)別有兩種方式,第一種引入 TransactionTemplate

@Autowired
TransactionTemplate transactionTemplate;

transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);

第二種直接在注解上標(biāo)明級(jí)別

@Transactional(isolation = Isolation.DEFAULT)

總結(jié)

Spring 中的事務(wù)隔離級(jí)別比 MySQL 中的事務(wù)隔離級(jí)別多了一種蚓哩,它包含的 5 種隔離級(jí)別分別是:

  • Isolation.DEFAULT:默認(rèn)的事務(wù)隔離級(jí)別构灸,以連接的數(shù)據(jù)庫的事務(wù)隔離級(jí)別為準(zhǔn)。
  • Isolation.READ_UNCOMMITTED:讀未提交岸梨,可以讀取到未提交的事務(wù)喜颁,存在臟讀。
  • Isolation.READ_COMMITTED:讀已提交曹阔,只能讀取到已經(jīng)提交的事務(wù)半开,解決了臟讀,存在不可重復(fù)讀次兆。
  • Isolation.REPEATABLE_READ:可重復(fù)讀稿茉,解決了不可重復(fù)讀,但存在幻讀(MySQL 數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級(jí)別)芥炭。
  • Isolation.SERIALIZABLE:串行化漓库,可以解決所有并發(fā)問題,但性能太低园蝠。

但需要注意是 Spring 是事務(wù)隔離級(jí)別是建立在連接的數(shù)據(jù)庫支持事務(wù)的基礎(chǔ)上的渺蒿,如果 Spring 項(xiàng)目連接的數(shù)據(jù)庫不支持事務(wù)(或事務(wù)隔離級(jí)別),那么即使在 Spring 中設(shè)置了事務(wù)隔離級(jí)別彪薛,也是無效的設(shè)置茂装。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市善延,隨后出現(xiàn)的幾起案子少态,更是在濱河造成了極大的恐慌,老刑警劉巖易遣,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼妻,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)侨歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門屋摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幽邓,你說我怎么就攤上這事炮温。” “怎么了牵舵?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵柒啤,是天一觀的道長。 經(jīng)常有香客問我棋枕,道長白修,這世上最難降的妖魔是什么妒峦? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任重斑,我火速辦了婚禮,結(jié)果婚禮上肯骇,老公的妹妹穿的比我還像新娘窥浪。我一直安慰自己,他們只是感情好笛丙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布漾脂。 她就那樣靜靜地躺著,像睡著了一般胚鸯。 火紅的嫁衣襯著肌膚如雪骨稿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天姜钳,我揣著相機(jī)與錄音坦冠,去河邊找鬼。 笑死哥桥,一個(gè)胖子當(dāng)著我的面吹牛辙浑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拟糕,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼判呕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了送滞?” 一聲冷哼從身側(cè)響起侠草,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犁嗅,沒想到半個(gè)月后边涕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愧哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年奥吩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哼蛆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霞赫,死狀恐怖腮介,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情端衰,我是刑警寧澤叠洗,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站旅东,受9級(jí)特大地震影響灭抑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抵代,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一腾节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荤牍,春花似錦案腺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晦嵌,卻和暖如春同辣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惭载。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來泰國打工旱函, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棕兼。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓陡舅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伴挚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靶衍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

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