mysql鎖的簡(jiǎn)單想法(不確定對(duì)不對(duì))

1. 隔離級(jí)別

1. read uncommitted

事務(wù)可以看見(jiàn)其他未提交事務(wù)的修改刘离。會(huì)導(dǎo)致臟讀捏题。

2. read committed

事務(wù)只能看見(jiàn)其他提交事務(wù)的修改。但是如果事務(wù)A讀取一批數(shù)據(jù)set,其他事務(wù)之后修改了這個(gè)數(shù)據(jù)set并提交(此時(shí)事務(wù)A沒(méi)有提交)刻肄,這時(shí)事務(wù)A再讀取數(shù)據(jù)set就跟第一次讀取的結(jié)果不一致。會(huì)導(dǎo)致不可重復(fù)讀融欧。

3. repeatable read

在事務(wù)執(zhí)行過(guò)程中敏弃,重復(fù)讀到的數(shù)據(jù)是一致的

4. serializable

2. 問(wèn)題

1. 臟讀

事務(wù)A讀到了事務(wù)B未提交的數(shù)據(jù)。(read uncommitted)

2. 不可重復(fù)讀

事務(wù)A第一次讀取行num噪馏,此時(shí)事務(wù)B修改行num并提交麦到,事務(wù)A再讀行num虹茶,數(shù)據(jù)會(huì)發(fā)生變化。(read uncommitted, read committed)

3. 幻讀

事務(wù)A第一次查詢范圍query_range隅要,返回n行蝴罪,此時(shí)事務(wù)B在該查詢范圍內(nèi)插入了一行數(shù)據(jù)并提交,事務(wù)A再次查詢范圍query_range會(huì)看到B插入的數(shù)據(jù)步清。(read uncommitted, read committed, repeatable read)

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

在同一個(gè)事務(wù)執(zhí)行過(guò)程中要门,兩次相同的查詢,但是查詢的返回?cái)?shù)據(jù)行數(shù)不同廓啊。

隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
read uncommitted yes yes yes
read committed no yes yes
repeatable read no no yes
serializable no no no

3. Innodb 行鎖算法

1. record lock 鎖住某一行

2. gap lock 鎖住兩行之間的間隙(不包括行本身)

3. next key lock 同時(shí)應(yīng)用1欢搜,2

4. 實(shí)例

0. current read, snapshot read

1. 實(shí)例1

  • 隔離級(jí)別 repeatable read
  • 數(shù)據(jù)庫(kù) mysql innodb
CREATE TABLE `test_lock` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> select * from test_lock;
+----+------+
| id | a    |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
|  6 |    6 |
+----+------+
6 rows in set (0.00 sec)

開啟sessionA, sessionB

sessionA> begin;
Query OK, 0 rows affected (0.01 sec)

sessionA> delete from test_lock where a=3;
Query OK, 1 row affected (0.00 sec)

sessionA>

此時(shí)鎖(行鎖、gap鎖)的情況如下圖,標(biāo)紅為加鎖谴轮,采用next key lock炒瘟。(不光在索引a上加鎖,索引a中3所對(duì)應(yīng)的主鍵索引也會(huì)加鎖第步,只畫了索引a)
注意:這里是主鍵索引的順序與a索引的順序一致的情況疮装。一致的情況下,新插入的4會(huì)插入在原來(lái)的4之后粘都。我們定義函數(shù)index_key(x), 表示獲取x所對(duì)應(yīng)的主鍵索引廓推,new(x)表示新插入的x,old(x)表示已經(jīng)存在的x翩隧。如果index_key(old(4))>index_key(new(4))樊展,那新的4是插不進(jìn)去的,因?yàn)樾碌?會(huì)被放在老的4的前面堆生。同理专缠,新插入的2也有可能插入進(jìn)去(只要index_key(new(2))<index_key(old(2)))。具體的例子整理后發(fā)出

lock.png

對(duì)于sessionB淑仆,插入2涝婉,3失敗,插入4成功糯景。(如圖lock.png嘁圈,新插入的2會(huì)被2與3之間gap鎖阻止,新插入的3肯定失敗蟀淮,但是新插入的4就沒(méi)問(wèn)題)

sessionB> insert into test_lock(a) values(2);
^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
sessionB> insert into test_lock(a) values(3);
^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
sessionB> insert into test_lock(a) values(4);
Query OK, 1 row affected (0.00 sec)

2. 實(shí)例2

  • 隔離級(jí)別 repeatable read
  • 數(shù)據(jù)庫(kù) mysql innodb
    驗(yàn)證實(shí)例1的另一種情況最住。
CREATE TABLE `test_lock` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> select * from test_lock2;
+----+------+
| id | a    |
+----+------+
|  1 |    1 |
|  5 |    3 |
|  3 |    5 |
|  7 |    7 |
+----+------+
6 rows in set (0.00 sec)

開啟sessionA:

sessionA> begin;
sessionA> delete from test_lock2 where a=5;

這個(gè)時(shí)候情況如下圖所示:


image.png

如果按照實(shí)例1的分析,不看主鍵索引id怠惶,應(yīng)該插入(id=4,a=3)應(yīng)該會(huì)被gap鎖鎖定涨缚,但是事實(shí)是可以插入成功。因?yàn)椴迦氲?i4=d,a=3)放在了(id=5,a=3)的上面。
同樣的道理脓魏,不看主鍵索引id兰吟,通過(guò)實(shí)例1的分析,插入(id=6,a=7)應(yīng)該可以插入茂翔,但是事實(shí)不行混蔼,因?yàn)?id=6,a=7)被a=5與a=7之間的gap鎖阻止了。
新插入的(id=4, a=3)珊燎,需要判斷會(huì)插入在(id=5, a=3)之前還是之后惭嚣,很明顯之前(4<5),那么(id=3, a=5)與(id=5, a=3)之間的gap鎖不會(huì)阻止悔政。
新插入的(id=6, a=7)晚吞,需要判斷會(huì)插入在(id=7, a=7)之前還是之后,很明顯之前(6<7)谋国,那么(id=6, a=7)會(huì)被(id=3, a=5)與(id=5, a=3)與(id=7, a=7)之間的gap鎖阻止槽地。

5.TODOLIST

1. 在普通索引相同、主鍵索引不同(廢話)的情況下芦瘾,order by普通索引捌蚊,順序是一定按照主鍵索引的順序返回嗎?(測(cè)試是這樣旅急,真要搞清楚還是要看代碼)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逢勾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子藐吮,更是在濱河造成了極大的恐慌,老刑警劉巖逃贝,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谣辞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沐扳,警方通過(guò)查閱死者的電腦和手機(jī)泥从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沪摄,“玉大人躯嫉,你說(shuō)我怎么就攤上這事⊙罟眨” “怎么了祈餐?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哄陶。 經(jīng)常有香客問(wèn)我帆阳,道長(zhǎng),這世上最難降的妖魔是什么屋吨? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任蜒谤,我火速辦了婚禮山宾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳍徽。我一直安慰自己资锰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布阶祭。 她就那樣靜靜地躺著绷杜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胖翰。 梳的紋絲不亂的頭發(fā)上接剩,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音萨咳,去河邊找鬼懊缺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛培他,可吹牛的內(nèi)容都是我干的鹃两。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼舀凛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俊扳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猛遍,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馋记,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后懊烤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯醒,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年腌紧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茸习。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壁肋,死狀恐怖号胚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浸遗,我是刑警寧澤猫胁,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乙帮,受9級(jí)特大地震影響杜漠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一驾茴、第九天 我趴在偏房一處隱蔽的房頂上張望盼樟。 院中可真熱鬧,春花似錦锈至、人聲如沸晨缴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)击碗。三九已至,卻和暖如春们拙,著一層夾襖步出監(jiān)牢的瞬間稍途,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工砚婆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械拍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓装盯,卻偏偏與公主長(zhǎng)得像坷虑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埂奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355