欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL事務(wù)隔離機(jī)制詳解

 更新時(shí)間:2022年11月21日 16:08:44   作者:天罡gg  
在數(shù)據(jù)庫(kù)中,事務(wù)是指一組邏輯操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位,這篇文章主要介紹了MySQL事務(wù)隔離機(jī)制,需要的朋友可以參考下

前言

如何控制并發(fā)是數(shù)據(jù)庫(kù)領(lǐng)域中非常重要的問(wèn)題之一,MySQL為了解決并發(fā)帶來(lái)的問(wèn)題,設(shè)計(jì)了事務(wù)隔離機(jī)制、鎖機(jī)制、MVCC機(jī)制,用一整套機(jī)制來(lái)解決并發(fā)問(wèn)題,本文主要介紹事務(wù)隔離機(jī)制。

一、什么是數(shù)據(jù)庫(kù)事務(wù)

事務(wù)transaction(簡(jiǎn)寫tx),在數(shù)據(jù)庫(kù)中,事務(wù)是指一組邏輯操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位。事務(wù)由事務(wù)開始與結(jié)束之間執(zhí)行的全部數(shù)據(jù)庫(kù)操作組成

事務(wù)具有以下4大特性,簡(jiǎn)稱ACID:

1、原子性(Atomicity)
事務(wù)是一個(gè)原子操作單元,是不可分割的最小工作單元,就像化學(xué)中的原子,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。

2、一致性(Consistent)
一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài)。
一致性也稱作是完整性,就是說(shuō)事務(wù)的執(zhí)行不能破壞數(shù)據(jù)庫(kù)的一致性,在事務(wù)開始和完成時(shí),數(shù)據(jù)都必須保持一致?tīng)顟B(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持數(shù)據(jù)的完整性。

3、隔離性(Isolation)
數(shù)據(jù)庫(kù)提供一定的隔離機(jī)制,當(dāng)多個(gè)事務(wù)并發(fā)訪問(wèn)時(shí),保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行,當(dāng)然了,不同的隔離級(jí)別決定了有多“獨(dú)立”。

4、持久性(Durable)
事務(wù)完成之后,它對(duì)于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。

小結(jié):原子性,持久性大家基本都能秒懂,隔離性也還好大家稍微想想都能理解,就是接下來(lái)要講的隔離級(jí)別,但對(duì)一致性很多人被官方概念繞住了,其實(shí)就是在多事務(wù)并發(fā)時(shí)要保證數(shù)據(jù)的一致和完整,不理解的話先看下面的問(wèn)題。

二、事務(wù)并發(fā)帶來(lái)的4類問(wèn)題

1、臟讀(Dirty Reads)
事務(wù)A讀取到了事務(wù)B修改但尚未提交的數(shù)據(jù),然后事務(wù)B回滾了,因此事務(wù)A基于此數(shù)據(jù)做的操作都是無(wú)效的,就是讀到了“臟”數(shù)據(jù)(實(shí)際上不應(yīng)該存在的數(shù)據(jù)),所以叫臟讀。

2、臟寫或丟失更新(Lost Update)
第一類丟失更新:撤銷rollback一個(gè)事務(wù)時(shí),把其他事務(wù)已經(jīng)提交更新的數(shù)據(jù)回滾掉了。
第二類丟失更新:提交commit一個(gè)事務(wù)時(shí),把其他事務(wù)已經(jīng)提交更新的數(shù)據(jù)覆蓋掉了。

3、不可重復(fù)讀(Non-Repeatable Reads)
在事務(wù)A中,按相同的條件執(zhí)行查詢過(guò)的sql,返回結(jié)果發(fā)生了修改或被刪除了,這種現(xiàn)象就叫做“不可重復(fù)讀”。

4、幻讀(Phantom Reads)
在事務(wù)A中,按相同的條件執(zhí)行查詢過(guò)的sql,返回結(jié)果中有新數(shù)據(jù)(是其它事務(wù)插入的),就好像發(fā)生了幻覺(jué)一樣,這就叫“幻讀”。

小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改或刪除,幻讀側(cè)重于新增。就這個(gè)結(jié)論網(wǎng)上很多博主寫的是不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除 (包括一些知名博主),大家請(qǐng)注意刪除不屬于幻讀,我會(huì)在第四段演示時(shí)求證。另外后面我會(huì)單獨(dú)安排一篇介紹MVCC機(jī)制,到時(shí)你自然會(huì)明白這里的原因。

三、事務(wù)4種隔離級(jí)別

在SQL標(biāo)準(zhǔn)中定義了四種隔離級(jí)別,每一種級(jí)別都規(guī)定了一個(gè)事務(wù)中所做的修改,哪些是在事務(wù)內(nèi)和事務(wù)間可見(jiàn)的,哪些是不可見(jiàn)的。較低級(jí)別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開銷也更低。

每種隔離級(jí)別可能出現(xiàn)的問(wèn)題如下:

事務(wù)隔離級(jí)別臟讀不可重復(fù)讀幻讀
讀未提交(RU)可能可能可能
讀已提交(RC)不可能可能可能
可重復(fù)讀(RR)不可能不可能可能
串行化(Serializable)不可能不可能不可能

1、讀未提交(Read uncommitted,RU)

事務(wù)中的修改,即使沒(méi)有提交,對(duì)其他事務(wù)也都是可見(jiàn)的,由于可能造成臟讀,所以在實(shí)際應(yīng)用中一般很少使用。

2、讀已提交(Read committed,RC)

事務(wù)A修改并提交的數(shù)據(jù)才會(huì)對(duì)其它事務(wù)可見(jiàn),所以解決臟讀的問(wèn)題。大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別都是讀已提交(像Oracle、PostgreSQL、SqlServer,但Mysql不是)。

3、可重復(fù)讀(Repeatable read,RR)
Mysql默認(rèn)的事務(wù)隔離級(jí)別。它保證了在同一個(gè)事務(wù)中多次讀取相同記錄的結(jié)果是一致的,所以解決了臟讀和不可重復(fù)讀問(wèn)題,但未徹底解決幻讀。

4、串行化(Serializable)

可串行化是最高的隔離級(jí)別。它通過(guò)強(qiáng)制事務(wù)串行執(zhí)行,避免了前面所說(shuō)的臟讀,不可重復(fù)讀和幻讀問(wèn)題。簡(jiǎn)單來(lái)說(shuō),可串行化會(huì)在讀取的每一行數(shù)據(jù)上都加上鎖,所以可能導(dǎo)致大量的超時(shí)和鎖爭(zhēng)用問(wèn)題。實(shí)際應(yīng)用中也很少用到這個(gè)隔離級(jí)別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒(méi)有并發(fā)的情況下,才考慮用該級(jí)別。

四、Mysql演示4種隔離級(jí)別

在MySQL中,InnoDB引擎支持事務(wù),MyISAM引擎不支持事務(wù),所以本文實(shí)驗(yàn)的測(cè)試環(huán)境:Windows 10 + MySQL5.7 + InnoDB。
Mysql5.7可以通過(guò)命令select @@tx_isolation;語(yǔ)句來(lái)查看:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

設(shè)置4種隔離級(jí)別的命令:

set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';

開始事務(wù):

begin;

提交事務(wù):

commit;

回滾事務(wù):

rollback;

1、讀未提交(RU)

set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin;

驗(yàn)證臟讀

在這里插入圖片描述

2、讀已提交(RC)

set tx_isolation='read-committed';
select @@tx_isolation;
begin;

驗(yàn)證解決臟讀,存在不可重復(fù)讀

![在這里插入圖片描述](https://img-blog.csdnimg.cn/d4406ad1415c46008d824c48a9c382e6.png

驗(yàn)證幻讀

在這里插入圖片描述

3、可重復(fù)讀(RR)

set tx_isolation='repeatable-read';
select @@tx_isolation;
begin;

驗(yàn)證解決臟讀和不可重復(fù)讀
上面說(shuō)的不可重復(fù)讀側(cè)重于修改或刪除,求證請(qǐng)看下面的截圖,

在這里插入圖片描述

驗(yàn)證幻讀
Mysql的RR級(jí)別在一定程度上解決了幻讀問(wèn)題,但不夠徹底,至于為什么這么說(shuō)?還是那句話,得深入理解MVCC機(jī)制,這個(gè)會(huì)單獨(dú)安排一篇,敬請(qǐng)期待!

在這里插入圖片描述

4、串行化(Serializable)

set tx_isolation='serializable';
select @@tx_isolation;
begin;

在這里插入圖片描述

如果長(zhǎng)時(shí)間阻塞,最后會(huì)鎖等待超時(shí),拋出異常:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
換成是在事務(wù)A執(zhí)行,結(jié)果也是一樣會(huì)阻塞,直到其它事務(wù)完成或超時(shí)拋出同樣的異常。
對(duì)于update也是同樣的道理,詳細(xì)如下圖:

在這里插入圖片描述

總結(jié)

通過(guò)本文我們已經(jīng)詳細(xì)說(shuō)明了:

事務(wù)4大特性:ACID事務(wù)并發(fā)帶來(lái)的4類問(wèn)題:臟讀、臟寫、不可重復(fù)讀、幻讀事務(wù)的4種隔離級(jí)別:讀未提交、讀已提交、可重復(fù)讀、串行化Mysql提供的4種隔離級(jí)別演示

剩下的MySQL鎖機(jī)制和MVCC機(jī)制,我們下文見(jiàn)!

參考文章:

什么是事務(wù)?
三分鐘圖解事務(wù)隔離級(jí)別,看一遍就懂
MySQL事務(wù)隔離級(jí)別詳解
MySQL的四種事務(wù)隔離級(jí)別
透徹解讀mysql的可重復(fù)讀、幻讀及實(shí)現(xiàn)原理
【MySQL (三) | 五分鐘搞清楚MySQL事務(wù)隔離級(jí)別】

到此這篇關(guān)于MySQL事務(wù)隔離機(jī)制的文章就介紹到這了,更多相關(guān)mysql事務(wù)隔離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL多層級(jí)結(jié)構(gòu)-區(qū)域表使用樹詳解

    MySQL多層級(jí)結(jié)構(gòu)-區(qū)域表使用樹詳解

    前面我們大概介紹了一下樹結(jié)構(gòu)表的基本使用。在我們項(xiàng)目中有好幾塊有用到多層級(jí)的概念。下面我們哪大家都比較熟悉的區(qū)域表來(lái)做演示
    2016-07-07
  • 探討MySQL?保存日期用哪種數(shù)據(jù)類型

    探討MySQL?保存日期用哪種數(shù)據(jù)類型

    在設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí)不可避免的需要用到時(shí)間類型,到底選擇那種數(shù)據(jù)類型來(lái)表示時(shí)間是一個(gè)值的討論的問(wèn)題,這篇文章主要介紹了MySQL保存日期用哪種數(shù)據(jù)類型,需要的朋友可以參考下
    2023-08-08
  • MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程

    MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程,默認(rèn)針對(duì)InnoDB存儲(chǔ)引擎下來(lái)將,需要的朋友可以參考下
    2015-11-11
  • 淺談MYSQL中樹形結(jié)構(gòu)表3種設(shè)計(jì)優(yōu)劣分析與分享

    淺談MYSQL中樹形結(jié)構(gòu)表3種設(shè)計(jì)優(yōu)劣分析與分享

    在開發(fā)中經(jīng)常遇到樹形結(jié)構(gòu)的場(chǎng)景,本文將以部門表為例對(duì)比幾種設(shè)計(jì)的優(yōu)缺點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 如何設(shè)置才能遠(yuǎn)程登錄Mysql數(shù)據(jù)庫(kù)

    如何設(shè)置才能遠(yuǎn)程登錄Mysql數(shù)據(jù)庫(kù)

    本地機(jī)器安裝的數(shù)據(jù)庫(kù),本地程序可以訪問(wèn),但是同事的機(jī)器卻無(wú)法連接訪問(wèn),發(fā)現(xiàn)是mysql數(shù)據(jù)庫(kù)沒(méi)有開啟遠(yuǎn)程訪問(wèn)。那么我們需要如何設(shè)置呢,這就是本文探討的內(nèi)容了
    2014-08-08
  • mysql 5.6.37(zip)下載安裝配置圖文教程

    mysql 5.6.37(zip)下載安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.6.37(zip)下載安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • mysql查詢表里的重復(fù)數(shù)據(jù)方法

    mysql查詢表里的重復(fù)數(shù)據(jù)方法

    這篇文章主要介紹了mysql查詢表里的重復(fù)數(shù)據(jù)方法,需要的朋友可以參考下
    2017-05-05
  • MySQL和Redis之間的存儲(chǔ)區(qū)別

    MySQL和Redis之間的存儲(chǔ)區(qū)別

    MySQL是一種關(guān)系型數(shù)據(jù)庫(kù),而Redis是一種鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),雖然它們都是用來(lái)存儲(chǔ)和管理數(shù)據(jù)的,但是它們?cè)诤芏喾矫娑加胁煌?,本文就給大家詳細(xì)介紹一下MySQL和Redis之間的存儲(chǔ)區(qū)別,感興趣的同學(xué)可以參考一下
    2023-06-06
  • 如何更改MySQL數(shù)據(jù)庫(kù)的編碼為utf8mb4

    如何更改MySQL數(shù)據(jù)庫(kù)的編碼為utf8mb4

    utf8mb4編碼是utf8編碼的超集,兼容utf8,并且能存儲(chǔ)4字節(jié)的表情字符。 這篇文章給大家介紹了更改MySQL數(shù)據(jù)庫(kù)的編碼為utf8mb4的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2020-02-02
  • Linux中查看MySQL服務(wù)是否開啟方式

    Linux中查看MySQL服務(wù)是否開啟方式

    這篇文章主要介紹了Linux中查看MySQL服務(wù)是否開啟方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論