隔離級(jí)別引發(fā)問題實(shí)驗(yàn)

繼續(xù)上篇博客 事務(wù)特性及隔離問題铁瞒。
我們來做一個(gè)關(guān)于隔離級(jí)別的實(shí)驗(yàn)荞估,將演示各個(gè)級(jí)別導(dǎo)致的隔離問題。
我們先打開兩個(gè)MySQL窗口衅斩,來模擬并發(fā)操作。

  1. 臟讀
    只有Read uncommitted級(jí)別才會(huì)發(fā)生臟讀問題怠褐,所以將其中一個(gè)窗口的隔離級(jí)別設(shè)置為Read uncommitted畏梆。輸入set transaction isolation level Read uncommitted;
    在MySQL5.5的64位版本中輸入該段代碼是無法修改隔離級(jí)別的,應(yīng)該輸入set session transaction isolation level read committed;修改隔離級(jí)別后奈懒,該窗口就被允許發(fā)生臟讀〉煊浚現(xiàn)在給這兩個(gè)窗口命名一下,方便后續(xù)講解磷杏,我們就令設(shè)置了事務(wù)隔離級(jí)別的窗口為B溜畅,另一個(gè)窗口為A。
    在A极祸、B窗口分別開啟一個(gè)事務(wù)慈格,輸入start transaction;現(xiàn)在同時(shí)查看兩個(gè)用戶的表數(shù)據(jù)
    在這里插入圖片描述

    現(xiàn)在在A窗口完成轉(zhuǎn)賬操作,輸入
update account set money = money - 200 where name = 'aaa';
update account set money = money + 200 where name = 'bbb';

然后查詢表數(shù)據(jù)


在這里插入圖片描述

轉(zhuǎn)賬操作成功執(zhí)行贿肩。
此時(shí)在B窗口進(jìn)行查詢


左邊是A窗口峦椰,右邊是B窗口
會(huì)發(fā)現(xiàn),B窗口讀取到了A窗口未提交的數(shù)據(jù)汰规,此時(shí)在A窗口進(jìn)行回滾操作汤功,再次查詢表數(shù)據(jù)
在這里插入圖片描述

兩個(gè)用戶的表數(shù)據(jù)都回到了原來的狀態(tài),但是B窗口在之前查詢數(shù)據(jù)的時(shí)候溜哮,是確認(rèn)了aaa賬戶轉(zhuǎn)賬了200元給bbb賬戶的滔金,而此時(shí)轉(zhuǎn)賬操作卻被回滾了,錢又相當(dāng)于轉(zhuǎn)回給了aaa賬戶茂嗓,此時(shí)就造成了bbb賬戶的經(jīng)濟(jì)損失餐茵,這就是臟讀現(xiàn)象。

  1. 不可重復(fù)讀
    修改事務(wù)隔離級(jí)別述吸,在B窗口輸入set transaction isolation level Read committed;
    這次我們重復(fù)剛才的操作忿族,兩邊同時(shí)開啟事務(wù),然后在A窗口更新數(shù)據(jù)蝌矛,接著兩邊都查詢一下表數(shù)據(jù)
    在這里插入圖片描述

    此時(shí)會(huì)發(fā)現(xiàn)道批,在A窗口未提交之前,B窗口的數(shù)據(jù)不會(huì)改變入撒。這時(shí)候就避免了臟讀隆豹,但是它會(huì)導(dǎo)致不可重復(fù)讀。我們讓A窗口提交茅逮,然后再次到B窗口查詢
    在這里插入圖片描述

    此時(shí)B窗口的表數(shù)據(jù)發(fā)生了變化璃赡,讀取到了A窗口提交的結(jié)果判哥,需要注意的是,B窗口在同一個(gè)事務(wù)中卻讀取到了兩次不同的表數(shù)據(jù)碉考,這就是不可重復(fù)讀塌计。
  2. 虛讀
    修改事務(wù)隔離級(jí)別,在B窗口輸入set transaction isolation level Repeatable read;
    在A豆励、B窗口分別開啟一個(gè)事務(wù)夺荒,在A窗口轉(zhuǎn)賬提交,B窗口連續(xù)地查詢良蒸,會(huì)發(fā)現(xiàn)B窗口是不會(huì)讀取到A提交的結(jié)果的技扼,這樣就避免了不可重復(fù)讀。
    在A窗口輸入更新語句
 update account set money = money-500 where name = 'bbb';
 update account set money = money+500 where name = 'ccc';

然后提交A窗口的操作嫩痰,查詢兩邊的表數(shù)據(jù)

在這里插入圖片描述

發(fā)現(xiàn)即使A窗口提交了操作剿吻,B窗口的表數(shù)據(jù)仍然不會(huì)被改變,證實(shí)了剛才的結(jié)論串纺,但是該隔離級(jí)別會(huì)導(dǎo)致虛讀的產(chǎn)生丽旅。很遺憾的是,虛讀無法為大家舉例了纺棺,因?yàn)樘撟x發(fā)生的概率是非常低的榄笙,但是方法還是給大家介紹一下。
在A窗口插入一條數(shù)據(jù)祷蝌,輸入insert into account values (4,'ddd',1000);茅撞,然后在B窗口進(jìn)行表數(shù)據(jù)查詢,如果查詢到了A窗口插入的數(shù)據(jù)巨朦,說明發(fā)生了虛讀米丘,但很顯然,這個(gè)現(xiàn)象并沒有發(fā)生糊啡,所以圖我就不貼了拄查。

  1. 最后介紹一下最后一個(gè)事務(wù)隔離級(jí)別
    演示一下Serializable的串行處理效果。
    將B窗口的級(jí)別設(shè)置為Serializable棚蓄,然后在A堕扶、B窗口同時(shí)開啟一個(gè)事務(wù),此時(shí)在B窗口執(zhí)行查詢語句梭依,然后在A窗口插入或更新一條數(shù)據(jù)挣柬,輸入insert into account values(5,'eee',1000);當(dāng)你按回車鍵執(zhí)行語句時(shí),你會(huì)發(fā)現(xiàn)睛挚,A窗口并沒有馬上執(zhí)行sql語句,而是阻塞了急黎。那這是為什么呢扎狱?因?yàn)樵摷?jí)別是最高隔離級(jí)別侧到,采取串行處理方法,在一個(gè)用戶操作該數(shù)據(jù)庫時(shí)淤击,不允許別的用戶操作匠抗。

那么接下來請(qǐng)注意了,在JDBC程序中如何控制數(shù)據(jù)庫的隔離級(jí)別呢污抬?
在Connection接口中定義了五個(gè)字段汞贸,它們就是用來控制對(duì)應(yīng)的隔離級(jí)別的,只需要調(diào)用setTransactionIsolation(int level)方法并將對(duì)應(yīng)的字段傳入印机,即可達(dá)到控制隔離級(jí)別的效果矢腻。如果不設(shè)置隔離級(jí)別,將采用數(shù)據(jù)庫默認(rèn)級(jí)別射赛,Oracle和MySQL數(shù)據(jù)庫的默認(rèn)級(jí)別是什么還記得嗎多柑?不記得的話就再次閱讀一下我的上一篇博客。
還有一個(gè)需要注意的地方楣责,在MySQL5.5的64位版本中竣灌,輸入set transaction isolation level代碼并不能成功修改事務(wù)隔離級(jí)別,這又是為什么呢秆麸?因?yàn)樵贛ySQL5.0的規(guī)范中就規(guī)定初嘹,該條語句必須加上一個(gè)關(guān)鍵字session,也就是說沮趣,想要成功修改屯烦,你得輸入set session transaction isolation level才能成功修改。

?著作權(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
  • 序言:老撾萬榮一對(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
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绑嘹。三九已至稽荧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間工腋,已是汗流浹背姨丈。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅腰,地道東北人蟋恬。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趁冈,于是被迫代替她去往敵國和親歼争。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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