婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL可重復讀級別能夠解決幻讀嗎

MySQL可重復讀級別能夠解決幻讀嗎

熱門標簽:南昌高頻外呼系統哪家公司做的好 淄博400電話申請 百度地圖標注后不顯示 俄國地圖標注app 電銷機器人 行業 溫州瑞安400電話怎么申請 電銷機器人各個細節介紹 昆明電信400電話辦理 電話機器人市場趨勢

引言

之前在深入了解數據庫理論的時候,了解到事物的不同隔離級別可能存在的問題。為了更好的理解所以在MySQL數據庫中測試復現這些問題。關于臟讀和不可重復讀在相應的隔離級別下都很容易的復現了。但是對于幻讀,我發現在可重復讀的隔離級別下沒有出現,當時想到難道是MySQL對幻讀做了什么處理?

測試:

創建一張測試用的表dept:

CREATE TABLE `dept` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

insert into dept(name) values("后勤部")

事物 1 事物 2
begin begin
select * from dept
- insert into dept(name) values("研發部")
- commit
select * from dept
commit

根據上面的流程執行,預期來說應該是事物1的第一條select查詢出一條數據,第二個select查詢出兩條數據(包含事物2提交的數據)。

但是在實際測試中發現第二條select實際上也只查詢處理一條數據。這是但是根據數據庫理論的可重復讀的實現(排他鎖和共享鎖)這是不應該的情況。

在了解實際原因前我們先復習下事物的相關理論。

數據庫原理理論

事物

事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。在關系數據庫中,一個事務可以是一組SQL語句或整個程序。

為什么要有事物

一個數據庫事務通常包含對數據庫進行讀或寫的一個操作序列。它的存在包含有以下兩個目的:

  • 為數據庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫在異常狀態下仍能保持一致性的方法。
  • 當多個應用程序在并發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,保證彼此的操作互相干擾。

事物特性

事務具有4個特性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為 ACID 特性。

  • 原子性(atomicity):
    一個事務應該是一個不可分割的工作單位,事務中包括的操作要么都成功,要么都不成功。
  • 一致性(consistency):
    事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  • 隔離性(isolation):
    一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據在事物未提交前對并發的其他事務是隔離的,并發執行的各個事務之間不能互相影響。
  • 持久性(durability):
    一個事務一旦成功提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

事物之間的幾個特性并不是一組同等的概念:

如果在任何時刻都只有一個事物,那么其天然是具有隔離性的,這時只要保證原子性就能具有一致性。

如果存在并發的情況下,就需要保證原子性和隔離性才能保證一致性。

數據庫并發事物中存在的問題

如果不考慮事務的隔離性,會發生以下幾種問題:

  • 臟讀:臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。當一個事務正在多次修改某個數據,而在這個事務中這多次的修改都還未提交,這時一個并發的事務來訪問該數據,就會造成兩個事務得到的數據不一致。
  • 不可重復讀:不可重復讀是指在對于數據庫中的某條數據,一個事務范圍內多次查詢返回不同的數據值(這里不同是指某一條或多條數據的內容前后不一致,但數據條數相同),這是由于在查詢間隔,該事物需要用到的數據被另一個事務修改并提交了。不可重復讀和臟讀的區別是,臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了其他事務提交的數據。需要注意的是在某些情況下不可重復讀并不是問題。
  • 幻讀:幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”并且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀可能發生在update,delete操作中,而幻讀發生在insert操作中。

排他鎖,共享鎖

排它鎖(Exclusive),又稱為X 鎖,寫鎖。

共享鎖(Shared),又稱為S 鎖,讀鎖。

讀寫鎖之間有以下的關系:

  • 一個事務對數據對象O加了 S 鎖,可以對 O進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對O 加 S 鎖,但是不能加 X 鎖。
  • 一個事務對數據對象 O 加了 X 鎖,就可以對 O 進行讀取和更新。加鎖期間其它事務不能對 O 加任何鎖。

即讀寫鎖之間的關系可以概括為:多讀單寫

事物的隔離級別

在事物中存在以下幾種隔離級別:

  • 讀未提交(Read Uncommitted):解決更新丟失問題。如果一個事務已經開始寫操作,那么其他事務則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現,即事物需要對某些數據進行修改必須對這些數據加 X 鎖,讀數據不需要加 S 鎖。
  • 讀已提交(Read Committed):解決了臟讀問題。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現, 即事物需要對某些數據進行修改必須對這些數據加 X 鎖,讀數據時需要加上 S 鎖,當數據讀取完成后立刻釋放 S 鎖,不用等到事物結束。
  • 可重復讀取(Repeatable Read):禁止不可重復讀取和臟讀取,但是有時可能出現幻讀數據。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。Mysql默認使用該隔離級別。這可以通過“共享讀鎖”和“排他寫鎖”實現,即事物需要對某些數據進行修改必須對這些數據加 X 鎖,讀數據時需要加上 S 鎖,當數據讀取完成并不立刻釋放 S 鎖,而是等到事物結束后再釋放。
  • 串行化(Serializable):解決了幻讀的問題的。提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能并發執行。僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

MySQL中的隔離級別的實現

上面的內容解釋了一些數據庫理論的概念,但是在MySQL、ORACLE這樣的數據庫中,為了性能的考慮并不是完全按照上面介紹的理論來實現的。

MVCC

多版本并發控制(Multi-Version Concurrency Control, MVCC)是MySQL中基于樂觀鎖理論實現隔離級別的方式,用于實現讀已提交和可重復讀取隔離級別的實現。

實現(隔離級別為可重復讀)

在說到如何實現前先引入兩個概念:

系統版本號:一個遞增的數字,每開始一個新的事務,系統版本號就會自動遞增。

事務版本號:事務開始時的系統版本號。

在MySQL中,會在表中每一條數據后面添加兩個字段:

創建版本號:創建一行數據時,將當前系統版本號作為創建版本號賦值

刪除版本號:刪除一行數據時,將當前系統版本號作為刪除版本號賦值

SELECT

select時讀取數據的規則為:創建版本號=當前事務版本號,刪除版本號為空或>當前事務版本號。

創建版本號=當前事務版本號保證取出的數據不會有后啟動的事物中創建的數據。這也是為什么在開始的示例中我們不會查出后來添加的數據的原因

刪除版本號為空或>當前事務版本號保證了至少在該事物開啟之前數據沒有被刪除,是應該被查出來的數據。

INSERT

insert時將當前的系統版本號賦值給創建版本號字段。

UPDATE

插入一條新紀錄,保存當前事務版本號為行創建版本號,同時保存當前事務版本號到原來刪除的行,實際上這里的更新是通過delete和insert實現的。

DELETE

刪除時將當前的系統版本號賦值給刪除版本號字段,標識該行數據在那一個事物中會被刪除,即使實際上在位commit時該數據沒有被刪除。根據select的規則后開啟懂數據也不會查詢到該數據。

MVCC真的解決了幻讀?

從最開始我們的測試示例和上面的理論支持來看貌似在MySQL中通過MVCC就解決了幻讀的問題,那既然這樣串行化讀貌似就沒啥意義了,帶著疑問繼續測試。

測試前數據:

事物 1 事物 2
begin begin
select * from dept
- insert into dept(name) values("研發部")
- commit
update dept set name="財務部"(工作中如果不想被辭退一定要寫where條件)
commit

根據上面的結果我們期望的結果是這樣的:

id  name
1   財務部
2   研發部

但是實際上我們的經過是:

本來我們希望得到的結果只是第一條數據的部門改為財務,但是結果確實兩條數據都被修改了。這種結果告訴我們其實在MySQL可重復讀的隔離級別中并不是完全解決了幻讀的問題,而是解決了讀數據情況下的幻讀問題。而對于修改的操作依舊存在幻讀問題,就是說MVCC對于幻讀的解決時不徹底的。

快照讀和當前讀

出現了上面的情況我們需要知道為什么會出現這種情況。在查閱了一些資料后發現在RR級別中,通過MVCC機制,雖然讓數據變得可重復讀,但我們讀到的數據可能是歷史數據,不是數據庫最新的數據。這種讀取歷史數據的方式,我們叫它快照讀 (snapshot read),而讀取數據庫最新版本數據的方式,叫當前讀 (current read)。

select 快照讀

當執行select操作是innodb默認會執行快照讀,會記錄下這次select后的結果,之后select 的時候就會返回這次快照的數據,即使其他事務提交了不會影響當前select的數據,這就實現了可重復讀了。快照的生成當在第一次執行select的時候,也就是說假設當A開啟了事務,然后沒有執行任何操作,這時候B insert了一條數據然后commit,這時候A執行 select,那么返回的數據中就會有B添加的那條數據。之后無論再有其他事務commit都沒有關系,因為快照已經生成了,后面的select都是根據快照來的。

當前讀

對于會對數據修改的操作(update、insert、delete)都是采用當前讀的模式。在執行這幾個操作時會讀取最新的記錄,即使是別的事務提交的數據也可以查詢到。假設要update一條記錄,但是在另一個事務中已經delete掉這條數據并且commit了,如果update就會產生沖突,所以在update的時候需要知道最新的數據。也正是因為這樣所以才導致上面我們測試的那種情況。

select的當前讀需要手動的加鎖:

select * from table where ? lock in share mode;
select * from table where ? for update;

有個問題說明下

在測試過程中最開始我以為使用begin語句就是開始一個事物了,所以在上面第二次測試中因為先開始的事物1,結果在事物1中卻查到了事物2新增的數據,當時認為這和前面MVCC中的select的規則不一致了,所以做了如下測試:

SELECT * FROM information_schema.INNODB_TRX //用于查詢當前正在執行中的事物

可以看到如果只是執行begin語句實際上并沒有開啟一個事物。

下面在begin后添加一條select語句:

所以要明白實際上是對數據進行了增刪改查等操作后才開啟了一個事物。

如何解決幻讀

很明顯可重復讀的隔離級別沒有辦法徹底的解決幻讀的問題,如果我們的項目中需要解決幻讀的話也有兩個辦法:

  • 使用串行化讀的隔離級別
  • MVCC+next-key locks:next-key locks由record locks(索引加鎖) 和 gap locks(間隙鎖,每次鎖住的不光是需要使用的數據,還會鎖住這些數據附近的數據)

實際上很多的項目中是不會使用到上面的兩種方法的,串行化讀的性能太差,而且其實幻讀很多時候是我們完全可以接受的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 詳解MySQL幻讀及如何消除
  • 詳解MySQL是如何解決幻讀的
  • MySQL如何解決幻讀問題

標簽:拉薩 洛陽 海口 吐魯番 嘉峪關 安徽 葫蘆島 甘南

巨人網絡通訊聲明:本文標題《MySQL可重復讀級別能夠解決幻讀嗎》,本文關鍵詞  MySQL,可重,復讀,級別,能夠,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL可重復讀級別能夠解決幻讀嗎》相關的同類信息!
  • 本頁收集關于MySQL可重復讀級別能夠解決幻讀嗎的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一区二区人人喊爽| 婷婷成人综合网| 2023国产一二三区日本精品2022| 欧美日韩一区三区| 在线观看区一区二| 91久久线看在观草草青青| 色偷偷88欧美精品久久久| 99热99精品| 色香蕉久久蜜桃| 欧美日韩久久久久久| 欧美精品一区二区三区在线播放| 日韩精品在线看片z| 日韩va亚洲va欧美va久久| 亚洲成人激情自拍| 亚洲福利一区二区| 午夜影院在线观看欧美| 午夜精品久久久久影视| 男女激情视频一区| 激情综合色综合久久| 色94色欧美sute亚洲线路一ni| 成人精品鲁一区一区二区| 国产ts人妖一区二区| 国产河南妇女毛片精品久久久 | 国产电影精品久久禁18| 日韩av电影一区| 亚洲欧洲日韩av| 国产精品久线观看视频| 国产黄色91视频| 不卡视频免费播放| 欧美视频在线观看一区二区| 欧美一区二区三区性视频| 欧美精品一区二区久久婷婷| 国产精品久久久久久久久快鸭| 亚洲精品老司机| 激情欧美一区二区三区在线观看| 99re免费视频精品全部| 日韩一区二区三区四区五区六区| 欧美激情在线一区二区三区| 亚洲激情五月婷婷| 国产精品一区二区免费不卡 | 99re成人精品视频| 日韩欧美激情四射| 亚洲欧美国产高清| 激情综合色播五月| 欧美日韩一区二区电影| 国产女主播视频一区二区| 亚洲二区在线视频| 成人国产精品免费观看视频| 日韩欧美中文一区二区| 亚洲一区二区三区在线| 99热国产精品| 欧美国产日韩精品免费观看| 久久国产麻豆精品| 欧美日韩一区二区三区四区| 国产精品久久久久国产精品日日| 久久国产精品一区二区| 6080yy午夜一二三区久久| 亚洲精品国产第一综合99久久| 国产精品一级二级三级| 精品欧美久久久| 奇米一区二区三区av| 欧美日韩综合在线免费观看| 亚洲人成精品久久久久久 | 91麻豆自制传媒国产之光| 精品乱人伦一区二区三区| 日韩黄色免费电影| 欧美日韩在线亚洲一区蜜芽| 成人免费一区二区三区在线观看| 国产99精品国产| 日本一区二区视频在线观看| 丁香五精品蜜臀久久久久99网站| 国产偷v国产偷v亚洲高清| 国产大陆亚洲精品国产| 国产拍欧美日韩视频二区| 成人性生交大片| 国产精品私房写真福利视频| 不卡视频一二三四| 亚洲黄色性网站| 欧美日韩在线直播| 美女视频一区二区三区| 精品国产百合女同互慰| 精品一区二区三区免费播放| 亚洲精品一区在线观看| 国精产品一区一区三区mba桃花 | av不卡在线播放| 亚洲视频在线一区观看| 91蝌蚪porny| 亚洲成人av一区| 日韩一级免费观看| 国产成人av电影在线观看| 国产精品无人区| 在线观看视频一区| 日韩国产欧美在线观看| 久久久久久久一区| 99久久婷婷国产综合精品| 一级精品视频在线观看宜春院 | 午夜欧美2019年伦理| 日韩三级伦理片妻子的秘密按摩| 国产一区二区福利| 亚洲欧洲日韩在线| 日韩精品在线一区| 色哟哟一区二区三区| 亚洲成人免费视| 国产三级精品在线| 欧美狂野另类xxxxoooo| 国产精一区二区三区| 亚洲国产一区二区三区| 精品成人佐山爱一区二区| 色婷婷久久综合| 久久99国产精品成人| 亚洲视频你懂的| xf在线a精品一区二区视频网站| 91蜜桃免费观看视频| 久久99久久久欧美国产| 亚洲精品老司机| 国产欧美精品日韩区二区麻豆天美| 在线一区二区视频| 国产成人精品www牛牛影视| 亚洲成a人片在线观看中文| 国产亚洲欧美在线| 欧美日韩国产高清一区二区三区 | 久久精品人人做| 51精品国自产在线| 在线观看一区日韩| 91在线播放网址| 岛国一区二区三区| 久久国产精品99久久久久久老狼| 亚洲乱码国产乱码精品精小说| 久久先锋影音av鲁色资源网| 欧美日韩精品欧美日韩精品 | 日韩欧美国产一区在线观看| 欧美亚洲尤物久久| 成人18视频在线播放| 国产一二三精品| 美日韩黄色大片| 天天做天天摸天天爽国产一区 | 激情五月激情综合网| 日韩高清在线电影| 亚洲夂夂婷婷色拍ww47| 亚洲欧美日本在线| 亚洲特级片在线| 亚洲男人的天堂av| 亚洲天堂网中文字| 一区二区三区在线播放| 亚洲乱码国产乱码精品精可以看| 亚洲欧美综合在线精品| 亚洲婷婷综合久久一本伊一区| 国产精品嫩草99a| 亚洲图片另类小说| 亚洲综合免费观看高清在线观看| 亚洲六月丁香色婷婷综合久久| 日韩理论片网站| 亚洲自拍另类综合| 日日欢夜夜爽一区| 麻豆成人综合网| 激情综合网最新| 国产精品1区2区| 成人国产精品免费观看视频| 不卡一区二区中文字幕| 色偷偷成人一区二区三区91 | 亚洲国产sm捆绑调教视频| 性欧美大战久久久久久久久| 日韩在线一区二区| 久久99九九99精品| 成人av网站在线观看| 欧洲精品在线观看| 欧美一区二区三区电影| 2欧美一区二区三区在线观看视频| 久久精品视频一区| 一二三区精品视频| 精品午夜久久福利影院| 不卡在线观看av| 欧美精品欧美精品系列| 久久这里只有精品视频网| 国产精品初高中害羞小美女文| 亚洲欧洲中文日韩久久av乱码| 亚洲永久免费视频| 精品在线播放免费| 99麻豆久久久国产精品免费| 欧美午夜电影在线播放| 日韩三级免费观看| 亚洲色大成网站www久久九九| 日韩黄色在线观看| 成人影视亚洲图片在线| 欧美久久久一区| 欧美激情在线一区二区三区| 亚洲国产wwwccc36天堂| 床上的激情91.| 欧美一区二区三区免费观看视频| 国产精品视频观看| 免费成人av在线| 91丨porny丨国产| 精品国产91乱码一区二区三区| 亚洲天堂av老司机| 国产美女主播视频一区| 91精品国产色综合久久ai换脸 | 日韩成人午夜精品| 91免费观看国产| 国产欧美日韩精品一区| 久久精品久久综合|