MySQL - 鎖

1. 鎖

提到鎖趴生,一般都是因為存在競爭條件(Race Condition)而導致結果不可預測站辉。比如兩個線程同時修改某個值握巢,最終這個值的結果是什么有多種可能性。如果加入鎖敞曹,在線程訪問修改某個值的時候,可以禁止其他線程同時訪問修改這個值颤诀,這樣就避免了多種結果的可能性掂名。

MySQL Innodb的鎖的最小單位是行鎖,基于索引(Index)實現(xiàn)捶牢,加鎖的時候是在B+樹索引結構的節(jié)點上加鎖鸠珠。所以如果某個字段沒有索引,然后用戶通過這個字段進行查找來更新數(shù)據(jù)的時候就會導致整個表(其實是整個聚類索引的葉子結點)被加鎖秋麸;如果用戶通過聚類索引的字段進行查找渐排,則只對索引查找結果的葉子節(jié)點加鎖;如果用戶通過二級索引字段進行查找灸蟆,則除了對二級索引加鎖驯耻,還會對聚類索引加鎖。

2. 事務

事務具有ACID特性:分別是原子性(atomicity)炒考,一致性(consistency)可缚,隔離性(isolation),和持久性(durability)斋枢。
原子性(atomicity)是指一個事務內(nèi)的操作要不全被commit城看,要不整個rollback。
一致性(consistency)是指系統(tǒng)始終處于一致的狀態(tài)杏慰,事務操作只會使系統(tǒng)從一個狀態(tài)變幻到另一個一致的狀態(tài)测柠。
隔離性(isolation)是指各個事務之間是獨立的,隔離的缘滥,彼此不會相互影響轰胁。
持久性(durability)是指事務提交之后數(shù)據(jù)持久保存在數(shù)據(jù)庫系統(tǒng)中。

3. 數(shù)據(jù)庫的隔離級別

數(shù)據(jù)庫的隔離級別(Isolation level)分為:未提交讀(Uncommit Read)朝扼,提交讀(Commit Read)赃阀,可重復讀(Repeatable Read)和可串行化(Serializable)

在了解隔離級別之前先來看看InnoDB讀的分類:快照讀(snapshot read)現(xiàn)讀(current read)擎颖。
一般的SELECT都是快照讀榛斯,其他的讀都屬于現(xiàn)讀,比如SELECT * FROM tableName FOR SHARE搂捧⊥运祝快照讀不加鎖,根據(jù)隔離級別的不同讀取策略也不同允跑;現(xiàn)讀會加S鎖(共享鎖)或者X鎖(互斥鎖)王凑,其中SELECT ... FOR SHARE會加S鎖搪柑,其他情況都是加X鎖。

未提交讀(Uncommit Read)就是快照讀可以讀取事務內(nèi)修改了但是未提交的值索烹,這種情況下就會產(chǎn)生臟讀工碾。一般不會考慮設置為數(shù)據(jù)庫隔離級別。
提交讀(Commit Read)就是快照讀只可以讀取提交之后的數(shù)據(jù)百姓。這樣就消除了臟讀的產(chǎn)生渊额,但是會有幻讀產(chǎn)生的可能性。所謂幻讀就是本來要修改了年齡等于20的用戶的表信息垒拢,事務提交之后發(fā)現(xiàn)有些“沒有修改成功”端圈,因為有線程在上述事務期間插入了年齡為20的新用戶信息,這樣會有一種操作未成功的錯覺子库。是MySQL的默認隔離級別舱权。
可重復讀(Repeatable Read)的隔離級別下除了一般的行鎖,也會同時加上間隙鎖(gap lock)仑嗅。間隙鎖防止了幻讀的產(chǎn)生:上例中age為20的B+樹節(jié)點之間和范圍前后節(jié)點之間也會被加鎖宴倍,導致age為20的新數(shù)據(jù)無法插入。
可串行化(Serializable)的隔離級別下仓技,快照讀不復存在鸵贬,所有的讀都是現(xiàn)讀。讀寫沖突脖捻,導致性能下降阔逼。一般不會考慮設置為數(shù)據(jù)庫隔離級別。

4. 死鎖以及如何避免死鎖

Reference

hedengcheng.com/?p=771

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末地沮,一起剝皮案震驚了整個濱河市嗜浮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摩疑,老刑警劉巖危融,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雷袋,居然都是意外死亡吉殃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門楷怒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋勺,“玉大人,你說我怎么就攤上這事鸠删”辏” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵冶共,是天一觀的道長乾蛤。 經(jīng)常有香客問我,道長捅僵,這世上最難降的妖魔是什么家卖? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮庙楚,結果婚禮上上荡,老公的妹妹穿的比我還像新娘。我一直安慰自己馒闷,他們只是感情好酪捡,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纳账,像睡著了一般逛薇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疏虫,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天永罚,我揣著相機與錄音,去河邊找鬼卧秘。 笑死呢袱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翅敌。 我是一名探鬼主播羞福,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚯涮!你這毒婦竟也來了治专?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤遭顶,失蹤者是張志新(化名)和其女友劉穎看靠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體液肌,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挟炬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗦哆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤祖。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖老速,靈堂內(nèi)的尸體忽然破棺而出粥喜,到底是詐尸還是另有隱情,我是刑警寧澤橘券,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布额湘,位于F島的核電站卿吐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锋华。R本人自食惡果不足惜嗡官,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毯焕。 院中可真熱鬧衍腥,春花似錦、人聲如沸纳猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芜辕。三九已至尚骄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侵续,已是汗流浹背乖仇。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留询兴,地道東北人乃沙。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像诗舰,于是被迫代替她去往敵國和親警儒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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

  • MySQL 加鎖處理分析 轉載2013年12月13日 16:43:55 7598 原文地址:http://hede...
    初來的雨天閱讀 445評論 0 2
  • 背景 MySQL/InnoDB的加鎖分析眶根,一直是一個比較困難的話題蜀铲。我在工作過程中,經(jīng)常會有同事咨詢這方面的問題属百。...
    MakeACoder閱讀 610評論 0 3
  • 當一個系統(tǒng)訪問量上來的時候记劝,不只是數(shù)據(jù)庫性能瓶頸問題了,數(shù)據(jù)庫數(shù)據(jù)安全也會浮現(xiàn)族扰,這時候合理使用數(shù)據(jù)庫鎖機制就顯得異...
    初來的雨天閱讀 3,563評論 0 22
  • InnoDB 鎖 數(shù)據(jù)庫使用鎖是為了支持更好的并發(fā)厌丑,提供數(shù)據(jù)的完整性和一致性。InnoDB是一個支持行鎖的存儲引擎...
    大富帥閱讀 1,468評論 0 4
  • MySQL的事務支持 MySQL的事務支持不是綁定在MySQL服務器本身渔呵,而是與存儲引擎相關: MyISAM:不支...
    但莫閱讀 489評論 0 6