MySQL 事務(wù)

概念

事務(wù)就是保證一組數(shù)據(jù)庫(kù)操作聪富,要么全部成功斧账,要么全部失敗埋市。
在MySQL中冠桃,事務(wù)是在引擎層實(shí)現(xiàn)的。

特性(ACID)

  • 原子性(Atomicity):
    一個(gè)事務(wù)中的操作道宅,要么全部成功食听,要么全部失敗胸蛛。
  • 一致性(Consistency):
    事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫(kù)的完整性沒有被破壞樱报。
  • 隔離性(Isolation):
    數(shù)據(jù)庫(kù)支持多個(gè)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力葬项,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行導(dǎo)致的數(shù)據(jù)不一致。
  • 持久性(Durability)
    事務(wù)結(jié)束后肃弟,對(duì)數(shù)據(jù)的修改就是永久的玷室,即使系統(tǒng)故障也不會(huì)丟失。

隔離性與隔離級(jí)別

當(dāng)數(shù)據(jù)庫(kù)上有多個(gè)事務(wù)同時(shí)執(zhí)行時(shí)笤受,就可能出現(xiàn)臟讀穷缤、不可重復(fù)讀、幻讀的問題箩兽,為了解決這些問題津肛,就有了隔離級(jí)別的概念。

SQL標(biāo)準(zhǔn)的事務(wù)隔離級(jí)別包括:

  • 讀未提交(read uncommitted)
    一個(gè)事務(wù)還沒提交時(shí)汗贫,它做的變更就能被別的事務(wù)看到身坐。
  • 讀提交(read committed)
    一個(gè)事務(wù)只有提交后,它做的變更才能被別的事務(wù)看到落包。
  • 可重復(fù)讀(repeatable read)
    一個(gè)事務(wù)執(zhí)行過程中看到的數(shù)據(jù)部蛇,總是跟它在啟動(dòng)時(shí)看到的數(shù)據(jù)一致。
  • 串行化(serializable)
    當(dāng)出現(xiàn)讀寫鎖沖突的時(shí)候咐蝇,后訪問的事務(wù)必須等前一個(gè)事務(wù)完成涯鲁,才能繼續(xù)執(zhí)行。

舉例說(shuō)明各個(gè)隔離級(jí)別

假設(shè)數(shù)據(jù)表T中只有一列有序,其中一行的值為1抹腿,下面是按照時(shí)間順序執(zhí)行兩個(gè)事務(wù)的行為:

create table T(c int) engine=InnoDB;
insert into T(c) values(1);
兩個(gè)事務(wù)執(zhí)行順序.png

來(lái)看看在不同的事務(wù)隔離級(jí)別下,事務(wù)A的V1旭寿,V2警绩,V3的值分別是什么。

  • 讀未提交:雖然B還沒提交盅称,但是結(jié)果已經(jīng)被A看到了肩祥,所以V1、V2缩膝、V3都是2
  • 讀提交:B的修改提交后混狠,A才能看到,所以V1是1逞盆,V2檀蹋、V3是2
  • 可重復(fù)讀:A在提交前,看到的數(shù)據(jù)都和A啟動(dòng)時(shí)看到的一致,所以V1俯逾、V2是1贸桶,V3是2
  • 串行化:A先加了讀鎖,B在修改的時(shí)候桌肴,發(fā)生了讀寫鎖沖突皇筛,所以等到A提交后,B的修改才會(huì)接著執(zhí)行坠七,所以V1水醋、V2是1,V3是2

在實(shí)現(xiàn)上彪置,數(shù)據(jù)庫(kù)里面會(huì)創(chuàng)建一個(gè)視圖拄踪,訪問的時(shí)候以視圖的邏輯結(jié)果為準(zhǔn)。
在可重復(fù)讀隔離級(jí)別下拳魁,這個(gè)視圖是在事務(wù)啟動(dòng)時(shí)創(chuàng)建的惶桐,整個(gè)事務(wù)存在期間都用這個(gè)視圖;
在讀提交隔離級(jí)別下潘懊,這個(gè)視圖是在SQL語(yǔ)句開始執(zhí)行時(shí)創(chuàng)建的姚糊;
在讀未提交隔離級(jí)別下,直接返回記錄上的最新值授舟,沒有視圖概念救恨;
在串行化隔離級(jí)別下,直接用加鎖的方式避免并行訪問释树。

事務(wù)隔離的實(shí)現(xiàn)

在MySQL中肠槽,每條記錄在更新的時(shí)候,都會(huì)同時(shí)記錄一條回滾操作躏哩,記錄上的最新值署浩,通過回滾操作揉燃,都可以得到前一個(gè)狀態(tài)的值扫尺。
假設(shè)一個(gè)值從 1 被按順序改成了 2、3炊汤、4正驻,在回滾日志里面就會(huì)有類似下面的記錄。


回滾記錄.png

當(dāng)前值是 4抢腐,但是在查詢這條記錄的時(shí)候姑曙,不同時(shí)刻啟動(dòng)的事務(wù)會(huì)有不同的 read-view。在視圖 A迈倍、B伤靠、C 里,這個(gè)記錄的值分別為 1啼染、2宴合、4焕梅,同一條記錄在系統(tǒng)中可以存在多個(gè)版本,這就是數(shù)據(jù)庫(kù)的多版本并發(fā)控制(MVCC)卦洽。對(duì)于read-view A贞言,想要得到 1,就得將當(dāng)前值依次執(zhí)行圖中所有回滾操作才能得到阀蒂。

回滾日志不會(huì)一直保留该窗,系統(tǒng)會(huì)判斷,當(dāng)沒有事務(wù)需要用到這些回滾日志的時(shí)候蚤霞,回滾日志就會(huì)被刪除酗失。即當(dāng)系統(tǒng)里沒有比這個(gè)回滾日志更早的 read-view 的時(shí)候就會(huì)被刪除。

為什么盡量不要使用長(zhǎng)事務(wù)

長(zhǎng)事務(wù)意味著系統(tǒng)里會(huì)存在很老的事務(wù)視圖昧绣。由于這些事務(wù)隨時(shí)會(huì)訪問數(shù)據(jù)庫(kù)里的任何數(shù)據(jù)级零,所以這個(gè)事務(wù)提交之前,數(shù)據(jù)庫(kù)里它可能用到的回滾記錄都必須保留滞乙,就會(huì)導(dǎo)致占用大量存儲(chǔ)空間奏纪。

在 MySQL5.5 及以前的版本,回滾日志是跟數(shù)據(jù)字典一起放在 ibdata 文件里的斩启,即使長(zhǎng)事務(wù)最終提交序调,回滾段被清理,文件也不會(huì)變小兔簇》⒕睿可能存在數(shù)據(jù)只有20G,而回滾段有 200G 的庫(kù)垄琐,最終只好為了清理回滾段边酒,而重建整個(gè)庫(kù)。

除了對(duì)回滾段的影響狸窘,長(zhǎng)事務(wù)還占用鎖資源墩朦,也可能拖垮整個(gè)庫(kù)。

長(zhǎng)事務(wù)的查詢方式:
可以在 information_schema 庫(kù)的 innodb_trix 表中查詢長(zhǎng)事務(wù)翻擒。比如下面這個(gè)查找持續(xù)時(shí)間超過 60s 的事務(wù):

select 
    * 
from 
    information_schema.innodb_trx 
where 
    TIME_TO_SEC(timediff(now(),trx_started)) > 60
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氓涣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陋气,更是在濱河造成了極大的恐慌劳吠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巩趁,死亡現(xiàn)場(chǎng)離奇詭異痒玩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蠢古,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)燃观,“玉大人,你說(shuō)我怎么就攤上這事便瑟±禄伲” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵到涂,是天一觀的道長(zhǎng)脊框。 經(jīng)常有香客問我,道長(zhǎng)践啄,這世上最難降的妖魔是什么浇雹? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮屿讽,結(jié)果婚禮上昭灵,老公的妹妹穿的比我還像新娘。我一直安慰自己伐谈,他們只是感情好烂完,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诵棵,像睡著了一般抠蚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上履澳,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天嘶窄,我揣著相機(jī)與錄音,去河邊找鬼距贷。 笑死柄冲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忠蝗。 我是一名探鬼主播现横,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼什湘!你這毒婦竟也來(lái)了长赞?” 一聲冷哼從身側(cè)響起晦攒,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闽撤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脯颜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哟旗,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闸餐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饱亮。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舍沙,靈堂內(nèi)的尸體忽然破棺而出近上,到底是詐尸還是另有隱情,我是刑警寧澤拂铡,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布壹无,位于F島的核電站,受9級(jí)特大地震影響感帅,放射性物質(zhì)發(fā)生泄漏斗锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一失球、第九天 我趴在偏房一處隱蔽的房頂上張望岖是。 院中可真熱鬧,春花似錦实苞、人聲如沸豺撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)前硫。三九已至,卻和暖如春荧止,著一層夾襖步出監(jiān)牢的瞬間屹电,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工跃巡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留危号,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓素邪,卻偏偏與公主長(zhǎng)得像外莲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兔朦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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