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

MYSQL中的樂觀鎖實現(MVCC)簡析

數據庫 MySQL
眾所周知,在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務分為四個隔離級別,其中默認的隔離級別REPEATABLE READ需要兩個不同的事務相互之間不能影響,而且還能支持并發,這點悲觀鎖是達不到的,所以REPEATABLE READ采用的就是樂觀鎖,而樂觀鎖的實現采用的就是MVCC。

什么是MVCC

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

[[191205]]

MVCC是解決了什么問題

眾所周知,在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務分為四個隔離級別,其中默認的隔離級別REPEATABLE READ需要兩個不同的事務相互之間不能影響,而且還能支持并發,這點悲觀鎖是達不到的,所以REPEATABLE READ采用的就是樂觀鎖,而樂觀鎖的實現采用的就是MVCC。正是因為有了MVCC,才造就了InnoDB強大的事務處理能力。

MVCC具體實現分析

InnoDB的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實現的,這兩個列,分別保存了這個行的創建時間,一個保存的是行的刪除時間。這里存儲的并不是實際的時間值,而是系統版本號(可以理解為事務的ID),每開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的ID.下面看一下在REPEATABLE READ隔離級別下,MVCC具體是如何操作的。

首先創建一張表:

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

假設系統的版本號從1開始.

INSERT

InnoDB為新插入的每一行保存當前系統版本號作為版本號。***個事務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

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

SELECT

InnoDB會根據以下兩個條件檢查每行記錄:

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

DELETE

InnoDB會為刪除的每一行保存當前系統的版本號(事務的ID)作為刪除標識.

看下面的具體例子分析: 第二個事務,ID為2:

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

假設1:

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

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

這時表中的數據如下:

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

假設2

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

第四個事務:

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

此時數據庫中的表如下:

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

UPDATE

InnoDB執行UPDATE,實際上是新插入了一行記錄,并保存其創建時間為當前事務的ID,同時保存當前事務ID到要UPDATE的行的刪除時間。

假設3:

假設在執行完事務2的(1)后又執行,其它用戶執行了事務3,4,這時,又有一個用戶對這張表執行了UPDATE操作:

第5個事務:

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

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

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

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

責任編輯:武曉燕 來源: segmentfault
相關推薦

2024-07-25 09:01:22

2020-10-22 08:21:37

樂觀鎖、悲觀鎖和MVC

2023-10-31 10:51:56

MySQLMVCC并發性

2021-03-30 09:45:11

悲觀鎖樂觀鎖Optimistic

2011-07-12 14:04:58

2023-01-30 18:44:45

MVCC事務

2025-04-07 03:00:00

MySQLDDLonline

2009-09-25 16:43:44

Hibernate悲觀Hibernate樂觀

2023-12-28 10:54:58

MySQL記錄存儲

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2020-05-20 10:35:53

Python開發函數

2010-09-10 13:57:55

echo命令

2025-04-02 01:22:44

MySQL樂觀鎖數據

2010-09-13 16:58:13

2009-09-03 10:52:41

C#遞歸樹

2009-06-08 21:25:29

Java聲音技術

2010-09-08 16:25:39

SIP協議棧

2010-09-10 09:52:44

開源協議棧

2011-07-25 12:53:34

MPLS VPNCisco

2022-09-02 08:03:44

IO程序網卡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲日韩第一页 | 日韩精品一区二区三区中文字幕 | 国产精品久久久久久久久免费桃花 | 日韩一区二区在线视频 | 古装人性做爰av网站 | 亚洲国产精选 | 免费在线播放黄色 | 91中文字幕在线 | 中文字幕在线一区二区三区 | 在线播放精品视频 | 日韩欧美大片在线观看 | 91美女在线| 成人在线精品视频 | 国产ts人妖一区二区三区 | 亚洲精品一区国产精品 | 亚洲一区二区三区视频 | 这里只有精品999 | 奇米久久 | 精品少妇一区二区三区日产乱码 | 日本不卡免费新一二三区 | 一级全黄视频 | 久久国产美女视频 | 日韩在线视频免费观看 | 国产乱码精品一区二区三区中文 | 欧美日韩国产精品一区 | 国产精品视屏 | 国产精品jizz在线观看老狼 | 亚洲男人网 | 欧美午夜一区二区三区免费大片 | 在线视频成人 | 一区在线免费视频 | 黄色片大全在线观看 | 91av导航 | 精品久久久久久久 | 91亚洲国产 | 亚洲成人一区 | 婷婷久久综合 | 国产成人av免费看 | 亚洲欧美一区二区三区在线 | 女人夜夜春 | 亚洲性视频 |