mysql事務(wù)與鎖

事務(wù)定義

一組原子性SQL查詢委可,獨(dú)立的工作單元

ACID(atomicity-原子性,consistency-一致性,isolation-隔離性,durability-持久性)

  • 事務(wù)不可分割
  • 從一個(gè)一致性狀態(tài)轉(zhuǎn)到另一個(gè)一致性狀態(tài)
  • 事務(wù)修改提交之前對(duì)其他事務(wù)不可見
  • 一旦提交,永遠(yuǎn)保存

根據(jù)業(yè)務(wù)是否需要事務(wù)腊嗡,選擇合適的儲(chǔ)存引擎着倾,提升性能
若存儲(chǔ)引擎不支持事務(wù)也可以使用locktable提供一定保護(hù)

隔離級(jí)別

  • 臟讀(dirty read):事務(wù)讀取了未提交的數(shù)據(jù)
  • 不可重復(fù)讀(nonrepeatable read):事務(wù)T1讀取一行記錄拾酝,緊接著事務(wù)T2修改了T1剛才讀取的那一行記錄,然后T1又再次讀取這行記錄屈呕,發(fā)現(xiàn)與剛才讀取的結(jié)果不同
  • 幻像讀(phantom read):當(dāng)某個(gè)事務(wù)在讀某個(gè)范圍內(nèi)的記錄時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)加入了新的記錄棺亭,當(dāng)之前的事務(wù)再讀取該范圍的記錄時(shí)虎眨,會(huì)產(chǎn)生幻行。InnoDB和XtraDB存儲(chǔ)引擎通過MVCC解決了幻像讀的問題

READ UNCOMMITTED(未提交讀): 事務(wù)的修改即使未提交镶摘,對(duì)其他事務(wù)也可見嗽桩,性能略好,但有很多問題凄敢,不建議使用

READ COMMITTED(提交讀): 事務(wù)所做的修改在提交前對(duì)其他事務(wù)不可見碌冶,大多數(shù)數(shù)據(jù)庫默認(rèn)隔離級(jí)別

REPEATABLE READ(可重復(fù)讀): 同一事務(wù)多次讀取的記錄結(jié)果是一致的,Mysql默認(rèn)級(jí)別

SERIALIZABLE(序列化) : 強(qiáng)制事務(wù)串行執(zhí)行,會(huì)對(duì)讀取的每一行數(shù)據(jù)加鎖涝缝,會(huì)導(dǎo)致大量的超時(shí)和鎖爭用扑庞,用在非常需要確保數(shù)據(jù)的一致性并且可以接受沒有并發(fā)的情況下

事務(wù)的隔離級(jí)別|臟讀可能性|不可重復(fù)讀可能性|幻像讀可能性|備注
--|--|--|---
READ UNCOMMITTED未提交讀|YES|YES|YES
READ COMMITTED提交讀|No|YES|YES
REPEATABLE READ可重復(fù)讀|No|No|YES|Mysql默認(rèn)級(jí)別
SERIALIZABLE序列化|No|No|No|會(huì)在讀取的每一行數(shù)據(jù)上都加鎖

死鎖

多個(gè)事務(wù)在同一資源上互相占用,并請(qǐng)求鎖定對(duì)方占用的資源拒逮,從而導(dǎo)致惡性循環(huán)

  • 多個(gè)事務(wù)以不同的順序鎖定資源
  • 多個(gè)事務(wù)同時(shí)鎖定同一資源

解決方式:1. 檢測(cè)到死鎖時(shí)罐氨,立刻返回錯(cuò)誤 2. 當(dāng)查詢的時(shí)間達(dá)到鎖等待超時(shí)的設(shè)定后放棄鎖請(qǐng)求

InnoDB處理方式: 將持有最少行級(jí)排他鎖的事務(wù)進(jìn)行回滾

發(fā)生死鎖后,只有部分或者完全回滾其中一個(gè)事務(wù)滩援,才能打破死鎖栅隐。發(fā)生死鎖無法避免,程序設(shè)計(jì)時(shí)需要考慮如何處理死鎖玩徊,通常重新執(zhí)行因死鎖回滾的事務(wù)即可

事務(wù)日志

提高事務(wù)的效率

  1. 存儲(chǔ)引擎在修改表的數(shù)據(jù)時(shí)只需要修改其內(nèi)存拷貝租悄,再把該修改行為記錄到持久在硬盤上的事務(wù)日志中,而不用將修改的數(shù)據(jù)本身持久到磁盤恩袱。
  2. 事務(wù)日志采用的是追加的方式泣棋,寫日志的操作是在磁盤上的一小塊順序I/O,不像隨機(jī)I/O需要在多次移動(dòng)磁頭畔塔。

事務(wù)日志持久后外傅,內(nèi)存被修改的數(shù)據(jù)在后臺(tái)慢慢刷回到磁盤。稱為預(yù)寫式日志(Write-Ahead Logging)俩檬,修改數(shù)據(jù)需要寫兩次磁盤.

若數(shù)據(jù)的修改已經(jīng)記錄到日志并持久化萎胰,即使內(nèi)存的修改沒及時(shí)寫到磁盤,也可以在存儲(chǔ)引擎重啟時(shí)自動(dòng)恢復(fù)

MySQL事務(wù)

官方提供的事務(wù)存儲(chǔ)引擎:InnoDB和NDB Cluster
第三方:XtraDB和PBXT

自動(dòng)提交

mysql默認(rèn)會(huì)啟用自動(dòng)提交棚辽,每個(gè)查詢都會(huì)被當(dāng)作一個(gè)事務(wù)執(zhí)行提交操作技竟,在當(dāng)前連接中可以設(shè)置AUTOCOMMIT 1/ON或0/OFF。

導(dǎo)致大量數(shù)據(jù)改變的操作ALTER TABLE,還有LOCK TABLES等也會(huì)導(dǎo)致自動(dòng)提交

事務(wù)中混合使用存儲(chǔ)引擎

  • 在非事務(wù)型的表上屈藐,回滾操作無效榔组,且不會(huì)報(bào)錯(cuò)熙尉,只會(huì)有警告信息

為每張表選擇合適的存儲(chǔ)引擎

隱式、顯式鎖定

  • InnoDB使用兩段鎖定協(xié)議搓扯,事務(wù)執(zhí)行時(shí)检痰,可隨時(shí)執(zhí)行鎖定,只要到COMMIT或ROLLBACK時(shí)才會(huì)同時(shí)釋放所有鎖锨推,InnoDB會(huì)根據(jù)隔離級(jí)別自動(dòng)加鎖(隱式)
  • SELECT ... LOCK IN SHARE MODE和 SELECT ... FOR UPDATE 顯式鎖定铅歼,但不建議使用

LOCK TABLES、UNLOCK TABLES服務(wù)器層實(shí)現(xiàn)换可,不能代替事務(wù)椎椰,且影響性能

MVCC多版本并發(fā)控制

  • 行級(jí)鎖變種 能盡量避免加鎖 開銷低

此處介紹InnoDB對(duì)MVVC的實(shí)現(xiàn)

實(shí)現(xiàn)原理: 在每行記錄后保存兩個(gè)隱藏的列,一個(gè)保存行創(chuàng)建時(shí)間沾鳄,一個(gè)保存過期(刪除)時(shí)間慨飘,此處的時(shí)間指的是系統(tǒng)版本號(hào),它會(huì)在創(chuàng)建事務(wù)時(shí)遞增译荞,

具體操作

  • SElECT
    • 只查找版本號(hào)小號(hào)或等于當(dāng)前事務(wù)的版本號(hào)瓤的,確保讀取的行,或是在事務(wù)開始之前吞歼,或是事務(wù)自己插入的
    • 行的刪除版本要么未定義堤瘤,要么大于當(dāng)前事務(wù)版本號(hào),確保事務(wù)讀到行在事務(wù)開始之前未被刪除
  • INSERT
    • 插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)
  • DELETE
    • 插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)
  • UPDATE
    • 為插入的新記錄保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)浆熔,同時(shí)保存當(dāng)前系統(tǒng)版本號(hào)到原來的行作為行刪除標(biāo)識(shí)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本辐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子医增,更是在濱河造成了極大的恐慌慎皱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶骨,死亡現(xiàn)場(chǎng)離奇詭異茫多,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忽刽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門天揖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跪帝,你說我怎么就攤上這事今膊。” “怎么了伞剑?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵斑唬,是天一觀的道長。 經(jīng)常有香客問我,道長恕刘,這世上最難降的妖魔是什么缤谎? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮褐着,結(jié)果婚禮上坷澡,老公的妹妹穿的比我還像新娘。我一直安慰自己含蓉,他們只是感情好频敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谴餐,像睡著了一般姻政。 火紅的嫁衣襯著肌膚如雪籍凝。 梳的紋絲不亂的頭發(fā)上捌袜,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天囤热,我揣著相機(jī)與錄音,去河邊找鬼厌殉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侈咕,可吹牛的內(nèi)容都是我干的公罕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼耀销,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楼眷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熊尉,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤罐柳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狰住,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體张吉,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年催植,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肮蛹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡创南,死狀恐怖伦忠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稿辙,我是刑警寧澤缓苛,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響未桥,放射性物質(zhì)發(fā)生泄漏笔刹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一冬耿、第九天 我趴在偏房一處隱蔽的房頂上張望舌菜。 院中可真熱鬧,春花似錦亦镶、人聲如沸日月。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爱咬。三九已至,卻和暖如春绊起,著一層夾襖步出監(jiān)牢的瞬間精拟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工虱歪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜂绎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓笋鄙,卻偏偏與公主長得像师枣,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萧落,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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