成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MYSQL中的樂觀鎖實(shí)現(xiàn)(MVCC)簡析

數(shù)據(jù)庫 MySQL
眾所周知,在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務(wù)分為四個(gè)隔離級(jí)別,其中默認(rèn)的隔離級(jí)別REPEATABLE READ需要兩個(gè)不同的事務(wù)相互之間不能影響,而且還能支持并發(fā),這點(diǎn)悲觀鎖是達(dá)不到的,所以REPEATABLE READ采用的就是樂觀鎖,而樂觀鎖的實(shí)現(xiàn)采用的就是MVCC。

什么是MVCC

MVCC即Multi-Version Concurrency Control,中文翻譯過來叫多版本并發(fā)控制。

[[191205]]

MVCC是解決了什么問題

眾所周知,在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務(wù)分為四個(gè)隔離級(jí)別,其中默認(rèn)的隔離級(jí)別REPEATABLE READ需要兩個(gè)不同的事務(wù)相互之間不能影響,而且還能支持并發(fā),這點(diǎn)悲觀鎖是達(dá)不到的,所以REPEATABLE READ采用的就是樂觀鎖,而樂觀鎖的實(shí)現(xiàn)采用的就是MVCC。正是因?yàn)橛辛薓VCC,才造就了InnoDB強(qiáng)大的事務(wù)處理能力。

MVCC具體實(shí)現(xiàn)分析

InnoDB的MVCC,是通過在每行記錄后面保存兩個(gè)隱藏的列來實(shí)現(xiàn)的,這兩個(gè)列,分別保存了這個(gè)行的創(chuàng)建時(shí)間,一個(gè)保存的是行的刪除時(shí)間。這里存儲(chǔ)的并不是實(shí)際的時(shí)間值,而是系統(tǒng)版本號(hào)(可以理解為事務(wù)的ID),每開始一個(gè)新的事務(wù),系統(tǒng)版本號(hào)就會(huì)自動(dòng)遞增,事務(wù)開始時(shí)刻的系統(tǒng)版本號(hào)會(huì)作為事務(wù)的ID.下面看一下在REPEATABLE READ隔離級(jí)別下,MVCC具體是如何操作的。

首先創(chuàng)建一張表:

  1. create table yang(  
  2.     id int primary key auto_increment,  
  3.     name varchar(20) 
  4. ); 

假設(shè)系統(tǒng)的版本號(hào)從1開始.

INSERT

InnoDB為新插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為版本號(hào)。***個(gè)事務(wù)ID為1:

  1. start transaction;  
  2. insert into yang values(NULL,'yang'); 
  3. insert into yang values(NULL,'long'); 
  4. insert into yang values(NULL,'fei'); 
  5. commit

對(duì)應(yīng)在數(shù)據(jù)中的表如下(后面兩列是隱藏列,我們通過查詢語句并看不到)

SELECT

InnoDB會(huì)根據(jù)以下兩個(gè)條件檢查每行記錄:

  1. InnoDB只會(huì)查找版本早于當(dāng)前事務(wù)版本的數(shù)據(jù)行(也就是,行的系統(tǒng)版本號(hào)小于或等于事務(wù)的系統(tǒng)版本號(hào)),這樣可以確保事務(wù)讀取的行,要么是在事務(wù)開始前已經(jīng)存在的,要么是事務(wù)自身插入或者修改過的.
  2. 行的刪除版本要么未定義,要么大于當(dāng)前事務(wù)版本號(hào)(這可以確保事務(wù)讀取到的行,在事務(wù)開始之前未被刪除), 只有條件1、2同時(shí)滿足的記錄,才能返回作為查詢結(jié)果.

DELETE

InnoDB會(huì)為刪除的每一行保存當(dāng)前系統(tǒng)的版本號(hào)(事務(wù)的ID)作為刪除標(biāo)識(shí).

看下面的具體例子分析: 第二個(gè)事務(wù),ID為2:

  1. start transaction;  
  2. select * from yang;  
  3. select * from yang;  
  4. commit

假設(shè)1:

假設(shè)在執(zhí)行這個(gè)事務(wù)ID為2的過程中,剛執(zhí)行到(1),這時(shí),有另一個(gè)事務(wù)ID為3往這個(gè)表里插入了一條數(shù)據(jù); 第三個(gè)事務(wù)ID為3;

  1. start transaction
  2. insert into yang values(NULL,'tian'); 
  3. commit

這時(shí)表中的數(shù)據(jù)如下:

然后接著執(zhí)行事務(wù)2中的(2),由于id=4的數(shù)據(jù)的創(chuàng)建時(shí)間(事務(wù)ID為3),執(zhí)行當(dāng)前事務(wù)的ID為2,而InnoDB只會(huì)查找事務(wù)ID小于等于當(dāng)前事務(wù)ID的數(shù)據(jù)行,所以id=4的數(shù)據(jù)行并不會(huì)在執(zhí)行事務(wù)2中的(2)被檢索出來,在事務(wù)2中的兩條select 語句檢索出來的數(shù)據(jù)如下:

假設(shè)2

假設(shè)在執(zhí)行這個(gè)事務(wù)ID為2的過程中,剛執(zhí)行到(1),假設(shè)事務(wù)執(zhí)行完事務(wù)3后,接著又執(zhí)行了事務(wù)4;

第四個(gè)事務(wù):

  1. start transaction 
  2. delete from yang where id=1;  
  3. commit

此時(shí)數(shù)據(jù)庫中的表如下:

接著執(zhí)行事務(wù)ID為2的事務(wù)(2),根據(jù)SELECT 檢索條件可以知道,它會(huì)檢索創(chuàng)建時(shí)間(創(chuàng)建事務(wù)的ID)小于當(dāng)前事務(wù)ID的行和刪除時(shí)間(刪除事務(wù)的ID)大于當(dāng)前事務(wù)的行,而id=4的行上面已經(jīng)說過,而id=1的行由于刪除時(shí)間(刪除事務(wù)的ID)大于當(dāng)前事務(wù)的ID,所以事務(wù)2的(2)select * from yang也會(huì)把id=1的數(shù)據(jù)檢索出來.所以,事務(wù)2中的兩條select 語句檢索出來的數(shù)據(jù)都如下:

UPDATE

InnoDB執(zhí)行UPDATE,實(shí)際上是新插入了一行記錄,并保存其創(chuàng)建時(shí)間為當(dāng)前事務(wù)的ID,同時(shí)保存當(dāng)前事務(wù)ID到要UPDATE的行的刪除時(shí)間。

假設(shè)3:

假設(shè)在執(zhí)行完事務(wù)2的(1)后又執(zhí)行,其它用戶執(zhí)行了事務(wù)3,4,這時(shí),又有一個(gè)用戶對(duì)這張表執(zhí)行了UPDATE操作:

第5個(gè)事務(wù):

  1. start transaction;  
  2. update yang set name='Long' where id=2; 
  3. commit

根據(jù)update的更新原則:會(huì)生成新的一行,并在原來要修改的列的刪除時(shí)間列上添加本事務(wù)ID,得到表如下:

繼續(xù)執(zhí)行事務(wù)2的(2),根據(jù)select 語句的檢索條件,得到下表:

還是和事務(wù)2中(1)select 得到相同的結(jié)果.

責(zé)任編輯:武曉燕 來源: segmentfault
相關(guān)推薦

2024-07-25 09:01:22

2020-10-22 08:21:37

樂觀鎖、悲觀鎖和MVC

2023-10-31 10:51:56

MySQLMVCC并發(fā)性

2021-03-30 09:45:11

悲觀鎖樂觀鎖Optimistic

2011-07-12 14:04:58

2023-01-30 18:44:45

MVCC事務(wù)

2009-09-25 16:43:44

Hibernate悲觀Hibernate樂觀

2025-04-07 03:00:00

MySQLDDLonline

2025-04-02 01:22:44

MySQL樂觀鎖數(shù)據(jù)

2023-12-28 10:54:58

MySQL記錄存儲(chǔ)

2020-05-20 10:35:53

Python開發(fā)函數(shù)

2010-09-10 13:57:55

echo命令

2009-06-08 21:25:29

Java聲音技術(shù)

2010-09-08 16:25:39

SIP協(xié)議棧

2010-09-10 09:52:44

開源協(xié)議棧

2011-07-25 12:53:34

MPLS VPNCisco

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2010-09-13 16:58:13

2009-09-03 10:52:41

C#遞歸樹

2011-06-16 10:04:36

光纜光纖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91久久久久| h视频在线观看免费 | 久久精品色欧美aⅴ一区二区 | 黄色骚片 | 亚洲欧美视频一区 | 91国内产香蕉 | 另类专区亚洲 | 中文字幕在线视频一区二区三区 | 国产第一区二区 | 久久成人精品 | 在线看黄免费 | 91在线资源| 毛片一区二区 | 久草免费在线视频 | 国产清纯白嫩初高生在线播放视频 | 91精品麻豆日日躁夜夜躁 | 亚洲欧美激情四射 | 超碰欧美 | 欧美视频在线播放 | 一区二区三区网站 | 岛国午夜 | 国产韩国精品一区二区三区 | 欧美激情国产精品 | 久久久91 | 欧美激情综合 | 国产小视频精品 | 久久综合欧美 | 久久高清 | 亚洲国产精品久久久久久 | 99视频在线免费观看 | 久久高清 | 精品一区在线看 | 久久综合av | www97影院| 日本不卡在线观看 | 99精品欧美一区二区三区综合在线 | avmans最新导航地址 | 在线免费观看欧美 | 久久久久亚洲精品 | 国产毛片久久久 | 国产精品久久久久久久久久久久 |