高性能Mysql(2)-鎖和事務(wù)

1.并發(fā)控制

1.1鎖的類型:

共享鎖(shared lock)也叫讀鎖(read lock)郭蕉,排它鎖(exclusive lock) 也叫寫鎖(write lock),讀鎖是共享的弱匪,相互不阻塞的,而寫鎖是阻塞的,寫鎖的優(yōu)先級(jí)要高于讀鎖聪廉。

1.2鎖的策略:

表鎖:表鎖是Mysql中最基本的鎖的策略,并且是開(kāi)銷最小的策略故慈。當(dāng)用戶對(duì)表進(jìn)行操作的時(shí)候板熊,它會(huì)鎖定整張表。
行鎖:行鎖可以在最大程度上解決并發(fā)問(wèn)題察绷,但是也帶來(lái)了最大的鎖開(kāi)銷干签。

1.3死鎖

死鎖是指兩個(gè)或者多個(gè)事務(wù)在同一資源上相互占用,并請(qǐng)求鎖定對(duì)方占用的資源拆撼,從而導(dǎo)致惡性循環(huán)容劳。當(dāng)多個(gè)事務(wù)試圖以不同的順序鎖定資源的時(shí)候喘沿,就可能產(chǎn)生死鎖,當(dāng)多個(gè)事務(wù)鎖定同一資源的時(shí)候也會(huì)產(chǎn)生死鎖竭贩。

事務(wù)1:
start transaction;
update table set age=45 where id =3;
update table set age=20 where id =4;
commit;

事務(wù)2
start transaction ;
update table set age=13 where id =4;
update table set age=24 where id =3;
commit;

上面這種情況就是典型的死鎖案例蚜印。

1.4多版本并發(fā)控制(*)

上述的鎖是存儲(chǔ)引擎默認(rèn)實(shí)現(xiàn)的,而在真實(shí)的開(kāi)發(fā)環(huán)境中留量,最常用的就是樂(lè)觀鎖和悲觀鎖窄赋,這是兩種問(wèn)題的解決方案。
更新丟失問(wèn)題楼熄,更新丟失問(wèn)題即多個(gè)線程同時(shí)基于同一個(gè)查詢結(jié)果進(jìn)行操作忆绰,后執(zhí)行的操作將先進(jìn)行的操作覆蓋掉了。

+----+--------+------+----- +
| id | name | money|  status|
+----+--------+------+----- +
|  1 |  張三 | 1000 |   0    |
+----+--------+------+----- +

假設(shè)需要給張三轉(zhuǎn)賬100元轉(zhuǎn)賬完成后將status設(shè)置為1孝赫,證明已經(jīng)轉(zhuǎn)過(guò)帳就不再執(zhí)行轉(zhuǎn)賬操作较木。

1.select status from order where id =1;//等于0則操作
2.update  order set money=money+100 and status=1 where id=1 ;

這時(shí)假如有多個(gè)線程同時(shí)操作這條sql就會(huì)產(chǎn)生上述的丟失更新問(wèn)題。要就解決丟失更新的問(wèn)題有兩種方案青柄。

悲觀鎖(*)

悲觀的認(rèn)為每次操作都會(huì)產(chǎn)生丟失更新問(wèn)題伐债,要使用悲觀鎖策略我們必須進(jìn)行顯式的鎖定,因?yàn)樵趍ysql中默認(rèn)的采用的是autocommit模式致开,也就是說(shuō)如果不是顯式的開(kāi)啟一個(gè)事務(wù)峰锁,則每個(gè)查詢操作都會(huì)當(dāng)作一個(gè)事務(wù)提交。

start transction;
1.select status from order where id =1 for update;//等于0則操作
2.update  order set money=money+100 and status=1 where id=1 ;
commit;

此時(shí)mysql會(huì)將id為1的這一行數(shù)據(jù)鎖定双戳,直到更新完成才會(huì)釋放鎖虹蒋。
注意:MySQL InnoDB默認(rèn)Row-Level Lock,但是只有「明確」地指定主鍵飒货,MySQL 才會(huì)執(zhí)行Row lock (只鎖住被選取的數(shù)據(jù)) 魄衅,否則MySQL 將會(huì)執(zhí)行Table Lock (將整個(gè)數(shù)據(jù)表單給鎖住)。

樂(lè)觀鎖(*)

樂(lè)觀的認(rèn)為每次操作不會(huì)產(chǎn)生丟失更新問(wèn)題塘辅,在表中增加一個(gè)版本控制字段進(jìn)行控制晃虫。

update order set money=money+100 and version =version+1 where id=1 and version=0;

樂(lè)觀鎖和悲觀鎖沒(méi)有絕對(duì)的好壞,我們應(yīng)該根據(jù)具體的場(chǎng)景選用不同的解決方式扣墩。

2.事物

事務(wù)的是什么就不做闡述了

2.1事務(wù)的四個(gè)特新(ACID)

  • 原子性:一個(gè)事務(wù)必須是一個(gè)不可再分的最小的工作單元哲银,在整個(gè)事務(wù)中操作要么全部成功要么全不成功。
  • 一致性: 數(shù)據(jù)庫(kù)總是從一個(gè)一致性狀態(tài)到另一個(gè)一致性狀態(tài)呻惕,最終沒(méi)有提交的數(shù)據(jù)不會(huì)保存到數(shù)據(jù)庫(kù)中荆责。
  • 隔離性: 一個(gè)事務(wù)在提交之前對(duì)其他事務(wù)是不可見(jiàn)的
  • 持久性: 一旦事務(wù)提交則其修改的數(shù)據(jù)就永久的保存在數(shù)據(jù)庫(kù)中

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

  • read uncommited(未提交讀) 會(huì)發(fā)生臟讀
  • read commited(提交讀) 可以解決臟讀,可能會(huì)發(fā)生不可重復(fù)讀
  • repeatable read (可重復(fù)讀) 會(huì)產(chǎn)生幻讀
  • serializable (串行化) 一般不用

2.3Mysql中的事務(wù)

mysql中默認(rèn)的采用的是autocommit模式亚脆,也就是說(shuō)如果不是顯式的開(kāi)啟一個(gè)事務(wù)做院,則每個(gè)查詢操作都會(huì)當(dāng)作一個(gè)事務(wù)提交。可以通過(guò)設(shè)置autocommit開(kāi)啟或者禁用自動(dòng)提交模式山憨。1代表啟用查乒,0代表關(guān)閉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郁竟,一起剝皮案震驚了整個(gè)濱河市玛迄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棚亩,老刑警劉巖蓖议,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異讥蟆,居然都是意外死亡勒虾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瘸彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)修然,“玉大人,你說(shuō)我怎么就攤上這事质况°邓危” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵结榄,是天一觀的道長(zhǎng)中贝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)臼朗,這世上最難降的妖魔是什么邻寿? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮视哑,結(jié)果婚禮上绣否,老公的妹妹穿的比我還像新娘。我一直安慰自己挡毅,他們只是感情好枝秤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慷嗜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹壕。 梳的紋絲不亂的頭發(fā)上庆械,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音菌赖,去河邊找鬼缭乘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琉用,可吹牛的內(nèi)容都是我干的堕绩。 我是一名探鬼主播策幼,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奴紧!你這毒婦竟也來(lái)了特姐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黍氮,失蹤者是張志新(化名)和其女友劉穎唐含,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沫浆,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捷枯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了专执。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮捆。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖本股,靈堂內(nèi)的尸體忽然破棺而出攀痊,到底是詐尸還是另有隱情,我是刑警寧澤痊末,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布蚕苇,位于F島的核電站,受9級(jí)特大地震影響凿叠,放射性物質(zhì)發(fā)生泄漏涩笤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一盒件、第九天 我趴在偏房一處隱蔽的房頂上張望蹬碧。 院中可真熱鬧,春花似錦炒刁、人聲如沸恩沽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罗心。三九已至,卻和暖如春城瞎,著一層夾襖步出監(jiān)牢的瞬間渤闷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工脖镀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留飒箭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弦蹂,于是被迫代替她去往敵國(guó)和親肩碟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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