国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL數(shù)據(jù)庫(kù)中,在讀已提交和可重復(fù)讀這兩個(gè)不同事務(wù)隔離級(jí)別下幻讀的區(qū)別

這篇具有很好參考價(jià)值的文章主要介紹了MySQL數(shù)據(jù)庫(kù)中,在讀已提交和可重復(fù)讀這兩個(gè)不同事務(wù)隔離級(jí)別下幻讀的區(qū)別。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 前 言

在正式開始之前,先簡(jiǎn)單回顧一下并發(fā)事務(wù)存在的問題以及事務(wù)的隔離級(jí)別等內(nèi)容。

1.1 并發(fā)事務(wù)存在的問題

當(dāng)兩個(gè)或者兩個(gè)以上事務(wù)同時(shí)開啟去處理同一個(gè)表的數(shù)據(jù)時(shí),可能會(huì)存在以下的問題:

  • 丟失修改
  • 臟讀
  • 不可重復(fù)讀
  • 幻讀

丟失修改

丟失修改是指當(dāng)兩個(gè)或多個(gè)事務(wù)更新同一行記錄,產(chǎn)生更新丟失的現(xiàn)象,事務(wù)回滾覆蓋和事務(wù)提交覆蓋都會(huì)導(dǎo)致這種現(xiàn)象的產(chǎn)生。

臟讀

一個(gè)事務(wù)能讀取到另一個(gè)事務(wù)已經(jīng)修改但還沒有提交的數(shù)據(jù)。

不可重復(fù)讀

在一個(gè)事務(wù)中多次執(zhí)行同一條查詢語(yǔ)句,讀取到的數(shù)據(jù)內(nèi)容前后不一致。

幻讀

在一個(gè)事務(wù)中多次執(zhí)行同一條查詢語(yǔ)句,讀取到的數(shù)據(jù)記錄在數(shù)量上前后不一致,可能多了幾條記錄也可能少了幾條記錄。

1.2 事務(wù)的隔離級(jí)別

為了解決并發(fā)事務(wù)存在的問題,大佬們想到了一個(gè)手段,那就是對(duì)事務(wù)進(jìn)行隔離,最好是做到各個(gè)事務(wù)各干各的,互不干涉,但理想很豐滿,現(xiàn)實(shí)很骨感,哪可能一步到位呢。

為了應(yīng)對(duì)不同的需要,解決不同的問題,于是決定將事務(wù)的隔離分成四個(gè)級(jí)別,分別是:

  • 讀未提交
  • 讀已提交
  • 可重復(fù)讀
  • 串行化

它們各自能解決的并發(fā)事務(wù)問題如下表所示:

隔離級(jí)別 \ 事務(wù)問題 事務(wù)回滾覆蓋 臟讀 不可重復(fù)讀 事務(wù)提交覆蓋 幻讀
讀未提交 能解決 不能解決 不能解決 不能解決 不能解決
讀已提交 能解決 能解決 不能解決 不能解決 不能解決
可重復(fù)讀 能解決 能解決 能解決 能解決 不能完全解決,可能發(fā)生
串行化 能解決 能解決 能解決 能解決 能解決

1.3 快照讀和當(dāng)前讀

快照讀

快照讀是基于 MVCC 和 undo log 來(lái)實(shí)現(xiàn)的,讀取數(shù)據(jù)的歷史版本,得到一個(gè) ReadView (事務(wù)視圖) ,不對(duì)數(shù)據(jù)加鎖,適用于簡(jiǎn)單 select 語(yǔ)句。

這里提一句,所謂 MVCC 并發(fā)版本控制,就是靠 ReadView (事務(wù)視圖) 來(lái)實(shí)現(xiàn)的,多個(gè) readView 組成 undo log(回滾日志)。

當(dāng)前讀

當(dāng)前讀是基于行鎖 + 間隙鎖來(lái)實(shí)現(xiàn)的,讀取數(shù)據(jù)的最新版本,并對(duì)數(shù)據(jù)進(jìn)行加鎖,適用于 insert,update,delete, select ... for update, select ... lock in share mode 語(yǔ)句,以及加鎖了的 select 語(yǔ)句。

在更新數(shù)據(jù)時(shí),都是先讀后寫,而這個(gè)讀,就是指當(dāng)前讀,意味讀取數(shù)據(jù)時(shí),讀到的是該條數(shù)據(jù)最新生成的 ReadView。

2. 不同事務(wù)隔離級(jí)別下幻讀的區(qū)別

在上面的表格中,我們能看到,在讀已提交這個(gè)隔離級(jí)別下,幻讀是不能被解決的,也就是說會(huì)發(fā)生;而在可重復(fù)讀這個(gè)隔離級(jí)別下,幻讀則是沒有完全被解決,只是解決了部分,意味著仍然有可能發(fā)生。

那它們分別是怎么產(chǎn)生的?各自又有什么表現(xiàn)?有何區(qū)別?下面我們舉個(gè)例子來(lái)探究一下。

假設(shè)現(xiàn)在有兩個(gè)事務(wù),分別是事務(wù) A 和 事務(wù) B ,同時(shí)有一張學(xué)生表 student(表中只有一條記錄,stu_name 為王大) ,我們用這兩個(gè)事務(wù)來(lái)操作這張表。

2.1 讀已提交下的幻讀

在讀已提交這種事務(wù)隔離級(jí)別下,兩個(gè)事務(wù)的操作順序如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0;
insert into student(stu_name) values(‘李二’);
commit;
開始第二次查詢:select * from student where stu_id > 0;
  1. 事務(wù) A 第一次查詢,得到的數(shù)據(jù)記錄是 stu_name 為王大這一條
  2. 事務(wù) B 中途往表里插入了一條 stu_name 為李二的記錄,并提交自身的事務(wù)
  3. 事務(wù) A 用第一次查詢的 SQL 語(yǔ)句進(jìn)行第二次查詢時(shí),發(fā)現(xiàn)得到的數(shù)據(jù)記錄成了兩條,出現(xiàn)幻讀

表現(xiàn)

普通的查詢語(yǔ)句,能看到明顯幻讀現(xiàn)象。

原因剖析

事務(wù) A 中用的是普通的 select 語(yǔ)句,因此采用的是快照讀,但由于事務(wù)隔離級(jí)別為讀已提交,在讀已提交下,每次 select 操作,都會(huì)重新獲取最新版本的數(shù)據(jù),也正是因?yàn)檫@個(gè)原因,導(dǎo)致事務(wù) A 中兩次查詢得到的結(jié)果在數(shù)量不一致,產(chǎn)生幻讀。

解決方式

將事務(wù)隔離級(jí)別升級(jí)為可重復(fù)讀

2.2 可重復(fù)讀下的幻讀

2.2.1 情況一,無(wú)幻讀

在可重復(fù)讀這種事務(wù)隔離級(jí)別下,兩個(gè)事務(wù)的操作順序如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0;
insert into student(stu_name) values(‘李二’);
commit;
開始第二次查詢:select * from student where stu_id > 0;

像上面這樣的事務(wù)操作,雖然在讀已提交事務(wù)隔離級(jí)別下會(huì)產(chǎn)生幻讀,但在可重復(fù)讀事務(wù)隔離級(jí)別下,卻不會(huì)產(chǎn)生幻讀。

原因:在可重復(fù)讀事務(wù)隔離級(jí)別下,針對(duì)普通的 select 語(yǔ)句,采用的是快照讀,只會(huì)在第一次查詢的時(shí)候獲取一次數(shù)據(jù)的版本,往后繼續(xù)做相同的 select 操作,不會(huì)重新獲取,會(huì)延用前面得到的數(shù)據(jù)版本。

細(xì)心的你有沒有發(fā)現(xiàn),在可重復(fù)讀事務(wù)隔離級(jí)別下,對(duì)于快照讀(普通的 select 操作),這不就是使用 MVCC 解決幻讀問題嗎?你沒看錯(cuò),是這樣的。

2.2.2 情況二,有幻讀

在可重復(fù)讀這種事務(wù)隔離級(jí)別下,兩個(gè)事務(wù)的操作順序如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0;
insert into student(stu_name) values(‘李二’);
commit;
開始第二次查詢:select * from student where stu_id > 0 for update;

上面的事務(wù)操作,和前面不同的地方在于,第二次查詢加上了 for update ,也就是采用當(dāng)前讀。

表現(xiàn)

能看到明顯的幻讀現(xiàn)象

原因剖析

由于事務(wù) A 第二次查詢?cè)?SQL 語(yǔ)句末尾加上了 for update ,表示采用當(dāng)前讀的方式,獲取數(shù)據(jù)的最新版本,那么自然而然會(huì)把事務(wù) B 中途插入的數(shù)據(jù)給查出來(lái),從而出現(xiàn)幻讀。

解決方式

用 next-key lock 解決,如果是走索引,會(huì)鎖住索引本身的行鎖;如果是范圍,就會(huì)成為一個(gè)行鎖+間隙鎖,導(dǎo)致范圍內(nèi)的無(wú)法插入;如果是無(wú)索引的,直接全表加上了間隙鎖,無(wú)法插入,阻塞。

具體的操作方式如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0 for update;
insert into student(stu_name) values(‘李二’);
commit;
開始第二次查詢:select * from student where stu_id > 0 for update;

事務(wù) A 的每次查詢都加上 for update,這樣就不會(huì)出現(xiàn)幻讀,原因是事務(wù) B 的 insert 操作會(huì)被阻塞,無(wú)法將數(shù)據(jù)插入到表中,從而避免幻讀的出現(xiàn)。

2.2.3 情況三,有幻讀

在可重復(fù)讀這種事務(wù)隔離級(jí)別下,兩個(gè)事務(wù)的操作順序如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0;
insert into student(stu_name) values(‘李二’);
commit;
update student set stu_class = ‘03’ where stu_id is not null;
開始第二次查詢:select * from student where stu_id > 0;

在上面的事務(wù)操作下,事務(wù) B 能將數(shù)據(jù)記錄正常插入到表中,而事務(wù) A 做了一次 update 操作,從上面的介紹我們可以知道,update 操作是當(dāng)前讀,會(huì)獲取到數(shù)據(jù)的最新版本,自然也能拿到事務(wù) B 的提交記錄。

表現(xiàn)

能明顯看到幻讀現(xiàn)象

原因剖析

事務(wù) A 的 update 操作采用的是當(dāng)前讀,會(huì)獲取數(shù)據(jù)的最新版本,將事務(wù) B 提交的結(jié)果讀取出來(lái),后面事務(wù) A 再做普通的 select 操作,采用快照讀,由于延用 update 操作時(shí)得到的數(shù)據(jù)歷史版本,因而產(chǎn)生幻讀。

解決方式

同 2.2.2 中的解決方式一樣,具體操作如下:

事務(wù)A 事務(wù)B
begin;
begin;
開始第一次查詢:select * from student where stu_id > 0 for update;
insert into student(stu_name) values(‘李二’);
commit;
update student set stu_class = ‘03’ where stu_id is not null;
開始第二次查詢:select * from student where stu_id > 0 for update;

最簡(jiǎn)單的解決方式,就是再將事務(wù)隔離級(jí)別升級(jí),改為串行化,畢竟串行化本身就解決所有事務(wù)問題,當(dāng)然,這會(huì)犧牲效率。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430943.html

3. 小 結(jié)

  1. 并發(fā)事務(wù)中,對(duì)于普通的 select 語(yǔ)句,在讀已提交下,能明顯看到幻讀的現(xiàn)象,而在可重復(fù)讀下,看不到幻讀現(xiàn)象。
  2. 并發(fā)事務(wù)中,對(duì)于事務(wù)執(zhí)行語(yǔ)句里含有當(dāng)前讀的情況,得具體問題具體分析,可能可以看到幻讀,也可能由于加了 for update ,看不到幻讀。

到了這里,關(guān)于MySQL數(shù)據(jù)庫(kù)中,在讀已提交和可重復(fù)讀這兩個(gè)不同事務(wù)隔離級(jí)別下幻讀的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 生成12位短id,自增且不連續(xù),永不重復(fù),不依賴數(shù)據(jù)庫(kù)

    基本思路: 設(shè)計(jì)模式:?jiǎn)卫J?是否加鎖:是 synchronized 獲取最后一次生成的時(shí)間戳值T0 限定初始時(shí)間為2023-08-01 00:00:00,獲取當(dāng)前時(shí)間時(shí)間戳T1,T1與初始時(shí)間的毫秒差值T2,轉(zhuǎn)為16進(jìn)制,轉(zhuǎn)為字符串為r1,獲取該字符串的長(zhǎng)度L1 獲取L2 (length - L1) ,獲取L2位數(shù)字的16進(jìn)制自增數(shù)值范圍

    2024年02月10日
    瀏覽(23)
  • 70萬(wàn)無(wú)符號(hào)無(wú)重復(fù)網(wǎng)名大全ACCESS\EXCEL數(shù)據(jù)庫(kù)

    雖然之前收集過網(wǎng)名數(shù)據(jù)庫(kù),比如:《4萬(wàn)個(gè)性網(wǎng)名大全網(wǎng)絡(luò)名稱大全ACCESS數(shù)據(jù)庫(kù)》、《8萬(wàn)多個(gè)網(wǎng)名大全QQ網(wǎng)名ACCESS數(shù)據(jù)庫(kù)》,但是都包含有~!#@等特殊符號(hào),而今天這份則是沒有特殊符號(hào)的,并且記錄數(shù)達(dá)到了71萬(wàn)且網(wǎng)名沒有重復(fù)。 分類統(tǒng)計(jì):搞笑網(wǎng)名(20577)、男生網(wǎng)名(

    2024年02月07日
    瀏覽(66)
  • java八股文面試[數(shù)據(jù)庫(kù)]——可重復(fù)讀怎么實(shí)現(xiàn)的(MVCC)

    java八股文面試[數(shù)據(jù)庫(kù)]——可重復(fù)讀怎么實(shí)現(xiàn)的(MVCC)

    可重復(fù)讀(repeatable read)定義: 一個(gè)事務(wù)執(zhí)行過程中看到的數(shù)據(jù),總是 跟這個(gè)事務(wù) 在 啟動(dòng)時(shí) 看到的數(shù)據(jù)是一致的。 MVCC MVCC, 多版本并發(fā)控制 , 用于實(shí)現(xiàn) 讀已提交 和 可重復(fù)讀 隔離級(jí)別。 MVCC的核心就是 Undo log多版本鏈 + Read view ,“MV”就是通過 Undo log來(lái)保存數(shù)據(jù)的歷史版

    2024年02月09日
    瀏覽(101)
  • 編寫一個(gè)微信小程序,實(shí)現(xiàn)表單提交數(shù)據(jù)到云數(shù)據(jù)庫(kù)

    好的。 首先,你需要在微信公眾平臺(tái)中創(chuàng)建一個(gè)小程序,并在小程序的后臺(tái)獲取到云開發(fā)的相關(guān)權(quán)限。然后你就可以使用微信小程序開發(fā)工具進(jìn)行開發(fā)了。 在頁(yè)面中創(chuàng)建一個(gè)表單,并在表單中添加輸入框和提交按鈕。 在小程序的 app.js 文件中初始化云開發(fā)環(huán)境。 在表單的提

    2024年02月07日
    瀏覽(23)
  • 論文筆記:從不平衡數(shù)據(jù)流中學(xué)習(xí)的綜述: 分類、挑戰(zhàn)、實(shí)證研究和可重復(fù)的實(shí)驗(yàn)框架

    論文筆記:從不平衡數(shù)據(jù)流中學(xué)習(xí)的綜述: 分類、挑戰(zhàn)、實(shí)證研究和可重復(fù)的實(shí)驗(yàn)框架

    論文:A survey on learning from imbalanced data streams: taxonomy, challenges, empirical study, and reproducible experimental framework 發(fā)表:2023年發(fā)表在Machine Learning上。 源代碼:https://github.com/canoalberto/imbalanced-streams 類不平衡給數(shù)據(jù)流分類帶來(lái)了新的挑戰(zhàn)。最近在文獻(xiàn)中提出的許多算法使用各種數(shù)據(jù)驅(qū)

    2024年02月11日
    瀏覽(14)
  • 【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫(kù), MySQL 刪除數(shù)據(jù)庫(kù),MySQL 選擇數(shù)據(jù)庫(kù)

    【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫(kù), MySQL 刪除數(shù)據(jù)庫(kù),MySQL 選擇數(shù)據(jù)庫(kù)

    作者簡(jiǎn)介: 辭七七,目前大一,正在學(xué)習(xí)C/C++,Java,Python等 作者主頁(yè): 七七的個(gè)人主頁(yè) 文章收錄專欄: 七七的閑談 歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!???? 我們可以在登陸 MySQL 服務(wù)后,使用 create 命令創(chuàng)建數(shù)據(jù)庫(kù),語(yǔ)法如下: 以下命令簡(jiǎn)單的演示了創(chuàng)建數(shù)據(jù)庫(kù)的過程,

    2024年02月13日
    瀏覽(115)
  • MySQL數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)管理系統(tǒng)與安裝MySQL數(shù)據(jù)庫(kù)

    MySQL數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)管理系統(tǒng)與安裝MySQL數(shù)據(jù)庫(kù)

    目錄 一、理論 1.數(shù)據(jù)庫(kù)管理系統(tǒng) 2.關(guān)系型數(shù)據(jù)庫(kù) 3.數(shù)據(jù)庫(kù) 4.MySQL數(shù)據(jù)庫(kù) 5.MySQL部署 二、實(shí)驗(yàn) 1.yum安裝MySQL 2.編譯安裝MySQL 3.配置MySQL數(shù)據(jù)庫(kù)的Tab補(bǔ)全? 三、問題 1.數(shù)據(jù)庫(kù)登錄報(bào)錯(cuò) 2.數(shù)據(jù)庫(kù)密碼復(fù)雜度報(bào)錯(cuò) 3.數(shù)據(jù)庫(kù)連接報(bào)錯(cuò) 四、總結(jié) (1)概念 數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management

    2024年02月12日
    瀏覽(28)
  • 初識(shí)MySQL數(shù)據(jù)庫(kù)——“MySQL數(shù)據(jù)庫(kù)”

    初識(shí)MySQL數(shù)據(jù)庫(kù)——“MySQL數(shù)據(jù)庫(kù)”

    各位CSDN的uu們你們好呀,小雅蘭好久沒有更文啦,確實(shí)是心有余而力不足,最近學(xué)習(xí)的內(nèi)容太難了,這篇博客又是小雅蘭的新專欄啦,主要介紹的是一些MySQL數(shù)據(jù)庫(kù)的知識(shí)點(diǎn),下面,讓我們進(jìn)入初識(shí)MySQL數(shù)據(jù)庫(kù)的世界吧 為什么要使用數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)管理系統(tǒng) MySQL介紹

    2024年02月06日
    瀏覽(18)
  • 【MySQL數(shù)據(jù)庫(kù)】MySQL數(shù)據(jù)庫(kù)管理

    【MySQL數(shù)據(jù)庫(kù)】MySQL數(shù)據(jù)庫(kù)管理

    Structure Query Language(結(jié)構(gòu)化查詢語(yǔ)言)簡(jiǎn)稱SQL,它被美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI)確定為關(guān)系型數(shù)據(jù)庫(kù)語(yǔ)言的美國(guó)標(biāo)準(zhǔn),后被國(guó)際化標(biāo)準(zhǔn)組織(ISO)采納為關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的國(guó)際標(biāo)準(zhǔn)。數(shù)據(jù)庫(kù)管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫(kù);定義和操作數(shù)據(jù),維護(hù)數(shù)據(jù)的完整性和安全性。 數(shù)據(jù):(data)

    2024年02月08日
    瀏覽(49)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包