理解事務(wù)的隔離特性

理解事務(wù)的隔離特性

臟讀、不可重復(fù)讀簇爆、幻讀

  • 臟讀:讀到別的事務(wù)還未提交的修改
  • 不可重復(fù)讀:讀到別的事務(wù)已提交的修改,即在同一事務(wù)中多次查詢結(jié)果不同
  • 幻讀:由于未讀到其他事務(wù)新插入或刪除的數(shù)據(jù)導(dǎo)致后續(xù)插入或刪除操作出錯,即之前的查詢結(jié)果是不真實的

臟讀和不可重復(fù)讀都針對的是現(xiàn)有數(shù)據(jù)被修改的情況怠硼,幻讀針對的是插入或刪除新數(shù)據(jù)的情況。

事務(wù)的隔離級別

在 SQL 標(biāo)準(zhǔn)中定義了四種數(shù)據(jù)庫的事務(wù)的隔離級別:READ UNCOMMITED移怯、READ COMMITED香璃、REPEATABLE READSERIALIZABLE。不同級別的特性如下:

級別 臟讀 不可重復(fù)讀 幻讀
READ UNCOMMITED 可能 可能 可能
READ COMMITED 不可能 可能 可能
REPEATABLE READ 不可能 不可能 可能
SERIALIZABLE 不可能 不可能 不可能

默認(rèn)的隔離級別為REPEATABLE READ舟误。

事務(wù)的隔離級別針對的是客戶端葡秒,是對當(dāng)前客戶端的約束,限制當(dāng)前客戶端的讀操作嵌溢,即

  • SERIALIZABLE級別強制當(dāng)前客戶端發(fā)起的寫事務(wù)等待其他客戶端的寫事務(wù)提交后再執(zhí)行
  • REPEATABLE READ級別限制當(dāng)前客戶端不能讀到其他客戶端的事務(wù)的修改
  • READ COMMITED級別限制當(dāng)前客戶端不能讀到其他客戶端的事務(wù)未提交的修改
  • READ UNCOMMITED級別不對當(dāng)前客戶端的讀事務(wù)進行限制

一個栗子

以如下的 score 表為例:

id student_id subject_id score
1 1 1001 90
2 1 1002 80
3 2 1001 60
4 2 1002 60.5

運行兩個并行的事務(wù):事務(wù)A和事務(wù)B眯牧。

其中,事務(wù)A執(zhí)行對score表中的score列的修改操作:

-- 事務(wù)A
BEGIN;
SELECT * FROM score;
UPDATE 
    score
SET
    score = score + 5;
SELECT * FROM score;

事務(wù)B執(zhí)行對score表的查詢操作:

-- 事務(wù)B
BEGIN;
SELECT * FROM score;

隔離級別為 REPEATABLE READ 時

在事務(wù)A還未提交修改時赖草,事務(wù)B查詢score表時学少,查詢不到事務(wù)A執(zhí)行的修改:

image

沒有發(fā)生臟讀現(xiàn)象

當(dāng)事務(wù)A提交(COMMIT)上述修改后秧骑,事務(wù)B查詢score表的結(jié)果如下:

image

同樣查詢不到事務(wù)A執(zhí)行的修改旱易,即沒有發(fā)生不可重復(fù)讀現(xiàn)象

因此在REPEATABLE READ隔離等級下腿堤,查詢到的是表的歷史版本阀坏。

如果在事務(wù)A提交之前想在事務(wù)B中修改表中的數(shù)據(jù),如:

UPDATE
    score
SET 
    score = score - 5;

MySQL在運行一段時間后會如下錯誤:

image

這是因為事務(wù)B在等待事務(wù)A先提交所做的修改笆檀,并且因為等待超時報錯忌堂。

這說明事務(wù)在執(zhí)行過程中禁止當(dāng)其他事務(wù)存在未提交修改時同時修改數(shù)據(jù)。

如果事務(wù)A在原表中插入一條數(shù)據(jù)酗洒,例如:

INSERT INTO score
VALUES
    (5, 3, 1001, 85);

無論事務(wù)A是否提交該數(shù)據(jù)士修,事務(wù)B的查詢結(jié)果均為:

image

即事務(wù)B查詢不到新插入的數(shù)據(jù),但此時如果事務(wù)B想在表中插入同樣的數(shù)據(jù)時樱衷,運行會報錯:

image

發(fā)生了幻讀現(xiàn)象棋嘲。

隔離級別為 READ COMMITED 時

在事務(wù)A還未提交修改時,事務(wù)B查詢score表的結(jié)果為:

image

此時矩桂,事務(wù)B查詢不到事務(wù)A未提交的修改沸移,即沒有發(fā)生臟讀現(xiàn)象

當(dāng)事務(wù)A提交上述修改后,事務(wù)B的查詢結(jié)果為:

image

此時雹锣,事務(wù)B可以查詢到事務(wù)A提交后的修改网沾,即發(fā)生了不可重復(fù)讀現(xiàn)象

如果事務(wù)A在原表中插入一條數(shù)據(jù)蕊爵,事務(wù)B查詢不到新插入的數(shù)據(jù)辉哥,但此時如果事務(wù)B想在表中插入同樣的數(shù)據(jù)時,運行會報錯:

image

發(fā)生了幻讀現(xiàn)象攒射。

隔離級別為 READ UNCOMMITED 時

在事務(wù)A還未提交修改時醋旦,事務(wù)B查詢score表的結(jié)果為:

image

此時,事務(wù)B可以查詢到事務(wù)A未提交的修改会放,即發(fā)生了臟讀現(xiàn)象浑度。

當(dāng)事務(wù)A提交上述修改后,事務(wù)B的查詢結(jié)果為:

image

此時鸦概,事務(wù)B可以查詢到事務(wù)A提交后的修改,即發(fā)生了不可重復(fù)讀現(xiàn)象甩骏。

如果事務(wù)A在原表中插入一條數(shù)據(jù)窗市,事務(wù)B查詢不到新插入的數(shù)據(jù),但此時如果事務(wù)B想在表中插入同樣的數(shù)據(jù)時饮笛,運行會報錯:

image

發(fā)生了幻讀現(xiàn)象咨察。

隔離級別為 SERIALIZABLE 時

在事務(wù)A還未提交修改時,事務(wù)B查詢score表的結(jié)果時福青,MySQL在運行一段時間后會報如下錯誤:

image

這表明事務(wù)B一直在等待事務(wù)A提交其修改直到超時摄狱。

說明了當(dāng)前的隔離級別實際上是將并行的事務(wù)強制串行執(zhí)行了。

當(dāng)事務(wù)A提交上述修改后无午,事務(wù)B查詢score表的結(jié)果如下:

image

同樣查詢不到事務(wù)A執(zhí)行的修改媒役,即沒有發(fā)生不可重復(fù)讀現(xiàn)象

如果事務(wù)A在原表中插入一條數(shù)據(jù)宪迟,在事務(wù)A還未交該數(shù)據(jù)時酣衷,事務(wù)B想插入同樣的數(shù)據(jù),MySQL在運行一段時間后會報如下錯誤:

image

這表明事務(wù)B一直在等待事務(wù)A提交其修改直到超時次泽。

沒有發(fā)生幻讀現(xiàn)象穿仪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市意荤,隨后出現(xiàn)的幾起案子啊片,更是在濱河造成了極大的恐慌,老刑警劉巖玖像,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紫谷,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機碴里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門沈矿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咬腋,你說我怎么就攤上這事羹膳。” “怎么了根竿?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵陵像,是天一觀的道長。 經(jīng)常有香客問我寇壳,道長醒颖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任壳炎,我火速辦了婚禮泞歉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匿辩。我一直安慰自己腰耙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布铲球。 她就那樣靜靜地躺著挺庞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稼病。 梳的紋絲不亂的頭發(fā)上选侨,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音然走,去河邊找鬼援制。 笑死,一個胖子當(dāng)著我的面吹牛芍瑞,可吹牛的內(nèi)容都是我干的隘谣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼啄巧,長吁一口氣:“原來是場噩夢啊……” “哼寻歧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秩仆,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤码泛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澄耍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪珊,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡晌缘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痢站。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷箕。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阵难,靈堂內(nèi)的尸體忽然破棺而出岳枷,到底是詐尸還是另有隱情,我是刑警寧澤呜叫,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布空繁,位于F島的核電站,受9級特大地震影響朱庆,放射性物質(zhì)發(fā)生泄漏盛泡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一娱颊、第九天 我趴在偏房一處隱蔽的房頂上張望傲诵。 院中可真熱鬧,春花似錦箱硕、人聲如沸拴竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至局待,卻和暖如春斑响,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钳榨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工舰罚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛耻。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓营罢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饼齿。 傳聞我的和親對象是個殘疾皇子饲漾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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