国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

一文帶你徹底了解MySQL事務(wù)機(jī)制

瀏覽:3日期:2023-08-28 20:27:10
目錄何謂事務(wù)?事務(wù)的特性:ACID事務(wù)的操作隔離性引發(fā)的并發(fā)問題不可重復(fù)讀和幻讀有什么區(qū)別事務(wù)的隔離級別MySQL 的隔離級別是基于鎖實(shí)現(xiàn)的嗎?默認(rèn)隔離級別解決幻讀的方法總結(jié)

我們設(shè)想一個場景,這個場景中我們需要插入多條相關(guān)聯(lián)的數(shù)據(jù)到數(shù)據(jù)庫,不幸的是,這個過程可能會遇到下面這些問題:

數(shù)據(jù)庫中途突然因?yàn)槟承┰驋斓袅恕?蛻舳送蝗灰驗(yàn)榫W(wǎng)絡(luò)原因連接不上數(shù)據(jù)庫了。并發(fā)訪問數(shù)據(jù)庫時,多個線程同時寫入數(shù)據(jù)庫,覆蓋了彼此的更改。…

上面的任何一個問題都可能會導(dǎo)致數(shù)據(jù)的不一致性。為了保證數(shù)據(jù)的一致性,系統(tǒng)必須能夠處理這些問題。事務(wù)就是我們抽象出來簡化這些問題的首選機(jī)制。

事務(wù)的概念起源于數(shù)據(jù)庫,目前已經(jīng)成為一個比較廣泛的概念。

何謂事務(wù)?

一個事情由n個單元組成,這n個單元在執(zhí)行過程中,要么同時成功,要么同時失敗,這就把n個單元放在了一個事務(wù)之中。

舉個簡單的例子:在不考慮試題正確與否的前提下,一張?jiān)嚲碛啥鄠€題目構(gòu)成,當(dāng)你答完題交給老師的時候是將一整張?jiān)嚲斫唤o老師,而不是將每道題單獨(dú)交給老師,在這里試卷就可以理解成一個事務(wù)。

事務(wù)的特性:ACID

A:原子性(Atomicity),原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作,要么都發(fā)生,要么都不發(fā)生。

例:假設(shè)你在購物車?yán)锾砑恿藘杉路荷弦潞脱澴樱?dāng)你把兩件衣服作為一個訂單提交支付的時候,要么兩件衣服一起支付成功,要么都失敗,不可能存在上衣付完錢了,褲子還沒付完的情況,反之亦然。

C:一致性(Consistency),在一個事務(wù)中,事務(wù)前后數(shù)據(jù)的完整性必須保持一致。

例:假設(shè)用戶A和用戶B兩者的錢加起來一共是200,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是200,這就是事務(wù)的一致性。

I:隔離性(Isolation),存在于多個事務(wù)中,事務(wù)的隔離性是指多個用戶并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事務(wù)不能被其它用戶的事務(wù)所干擾,多個并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離。

例:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。

D:持久性(Durability),持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

例:我們在操作數(shù)據(jù)庫時,事務(wù)提交或者回滾都會直接改變數(shù)據(jù)庫中的值。

AID是手段,C是目的,AID都是為了保證數(shù)據(jù)的一致性。

事務(wù)的操作

在使用事務(wù)之前,首先我們要開啟事務(wù),我們可以通過start或者begin命令開啟事務(wù);如果我們想提交事務(wù)可以手動執(zhí)行commit命令,如果我們想回滾事務(wù),可以執(zhí)行rollback命令。

# 開啟一個事務(wù)START TRANSACTION;# 多條 SQL 語句SQL1,SQL2...## 提交事務(wù)COMMIT;

注:在MySQL中事務(wù)的提交是默認(rèn)開啟的,可以執(zhí)行show variables like 'autocommit'命令查看,如果是ON則證明自動提交已經(jīng)開啟,如果為OFF則需要手動提交。

隔離性引發(fā)的并發(fā)問題

1)臟讀:B事務(wù)讀取到了A事務(wù)尚未提交的數(shù)據(jù);

一個事務(wù)讀取數(shù)據(jù)并且對數(shù)據(jù)進(jìn)行了修改,這個修改對其他事務(wù)來說是可見的,即使當(dāng)前事務(wù)沒有提交。這時另外一個事務(wù)讀取了這個還未提交的數(shù)據(jù),但第一個事務(wù)突然回滾,導(dǎo)致數(shù)據(jù)并沒有被提交到數(shù)據(jù)庫,那第二個事務(wù)讀取到的就是臟數(shù)據(jù),這也就是臟讀的由來。

2)不可重復(fù)讀:B事務(wù)讀到了A事務(wù)已經(jīng)提交的數(shù)據(jù),即B事務(wù)在A事務(wù)提交之前和提交之后讀取到的數(shù)據(jù)內(nèi)容不一致(AB事務(wù)操作的是同一條數(shù)據(jù));

事務(wù) 1 讀取某表中的數(shù)據(jù) A=20,事務(wù) 2 也讀取 A=20,事務(wù) 1 修改 A=A-1,事務(wù) 2 再次讀取 A =19,此時讀取的結(jié)果和第一次讀取的結(jié)果不同。

3)幻讀/虛讀:B事務(wù)讀到了A事務(wù)已經(jīng)提交的數(shù)據(jù),即A事務(wù)執(zhí)行插入操作,B事務(wù)在A事務(wù)前后讀到的數(shù)據(jù)數(shù)量不一致。

事務(wù) 2 讀取某個范圍的數(shù)據(jù),事務(wù) 1 在這個范圍插入了新的數(shù)據(jù),事務(wù) 2 再次讀取這個范圍的數(shù)據(jù)發(fā)現(xiàn)相比于第一次讀取的結(jié)果多了新的數(shù)據(jù)。

不可重復(fù)讀和幻讀有什么區(qū)別不可重復(fù)讀的重點(diǎn)是內(nèi)容修改或者記錄減少比如多次讀取一條記錄發(fā)現(xiàn)其中某些記錄的值被修改;幻讀的重點(diǎn)在于記錄新增比如多次執(zhí)行同一條查詢語句(DQL)時,發(fā)現(xiàn)查到的記錄增加了。

幻讀其實(shí)可以看作是不可重復(fù)讀的一種特殊情況,單獨(dú)把區(qū)分幻讀的原因主要是解決幻讀和不可重復(fù)讀的方案不一樣。

舉個例子:執(zhí)行 delete 和 update 操作的時候,可以直接對記錄加鎖,保證事務(wù)安全。而執(zhí)行 insert 操作的時候,由于記錄鎖(Record Lock)只能鎖住已經(jīng)存在的記錄,為了避免插入新記錄,需要依賴間隙鎖(Gap Lock)。也就是說執(zhí)行 insert 操作的時候需要依賴 Next-Key Lock(Record Lock+Gap Lock) 進(jìn)行加鎖來保證不出現(xiàn)幻讀。

事務(wù)的隔離級別

為了解決以上隔離性引發(fā)的并發(fā)問題,數(shù)據(jù)庫提供了事物的隔離機(jī)制。

read uncommitted(讀未提交): 一個事務(wù)還沒提交時,它做的變更就能被別的事務(wù)看到,讀取尚未提交的數(shù)據(jù),哪個問題都不能解決;read committed(讀已提交):一個事務(wù)提交之后,它做的變更才會被其他事務(wù)看到,讀取已經(jīng)提交的數(shù)據(jù),可以解決臟讀 ---- oracle默認(rèn)的;repeatable read(可重復(fù)讀):一個事務(wù)執(zhí)行過程中看到的數(shù)據(jù),總是跟這個事務(wù)在啟動時看到的數(shù)據(jù)是一致的,可以解決臟讀和不可重復(fù)讀 —mysql默認(rèn)的;serializable(串行化):顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當(dāng)出現(xiàn)讀寫鎖沖突的時候,后訪問的事務(wù)必須等前一個事務(wù)執(zhí)行完成,才能繼續(xù)執(zhí)行。可以解決臟讀、不可重復(fù)讀和虛讀—相當(dāng)于鎖表。

雖然serializable級別可以解決所有的數(shù)據(jù)庫并發(fā)問題,但是它會在讀取的每一行數(shù)據(jù)上都加鎖,這就可能導(dǎo)致大量的超時和鎖競爭問題,從而導(dǎo)致效率下降。所以我們在實(shí)際應(yīng)用中也很少使用serializable,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮采用該級別。

MySQL 的隔離級別是基于鎖實(shí)現(xiàn)的嗎?

MySQL 的隔離級別基于鎖和 MVCC 機(jī)制共同實(shí)現(xiàn)的。

SERIALIZABLE 隔離級別是通過鎖來實(shí)現(xiàn)的,READ-COMMITTED 和 REPEATABLE-READ 隔離級別是基于 MVCC 實(shí)現(xiàn)的。不過, SERIALIZABLE 之外的其他隔離級別可能也需要用到鎖機(jī)制,就比如 REPEATABLE-READ 在當(dāng)前讀情況下需要使用加鎖讀來保證不會出現(xiàn)幻讀。

默認(rèn)隔離級別

MySQL InnoDB 存儲引擎的默認(rèn)支持的隔離級別是 REPEATABLE-READ(可重復(fù)讀)。我們可以通過 SELECT @@tx_isolation;命令來查看,MySQL 8.0 該命令改為SELECT @@transaction_isolation;

# 開啟一個事務(wù)START TRANSACTION;# 多條 SQL 語句SQL1,SQL2...## 提交事務(wù)COMMIT;

從上面對 SQL 標(biāo)準(zhǔn)定義了四個隔離級別的介紹可以看出,標(biāo)準(zhǔn)的 SQL 隔離級別定義里,REPEATABLE-READ(可重復(fù)讀)是不可以防止幻讀的。

但是 InnoDB 實(shí)現(xiàn)的 REPEATABLE-READ 隔離級別其實(shí)是可以解決幻讀問題發(fā)生的,主要有下面兩種情況:

快照讀 :由 MVCC 機(jī)制來保證不出現(xiàn)幻讀。當(dāng)前讀 :使用 Next-Key Lock(臨鍵鎖) 進(jìn)行加鎖來保證不出現(xiàn)幻讀,Next-Key Lock 是行鎖(Record Lock)和間隙鎖(Gap Lock)的結(jié)合,行鎖只能鎖住已經(jīng)存在的行,為了避免插入新行,需要依賴間隙鎖。

InnoDB 存儲引擎在分布式事務(wù)的情況下一般會用到 SERIALIZABLE 隔離級別。

解決幻讀的方法

解決幻讀的方式有很多,但是它們的核心思想就是一個事務(wù)在操作某張表數(shù)據(jù)的時候,另外一個事務(wù)不允許新增或者刪除這張表中的數(shù)據(jù)了。解決幻讀的方式主要有以下幾種:

將事務(wù)隔離級別調(diào)整為 SERIALIZABLE 。在可重復(fù)讀的事務(wù)級別下,給事務(wù)操作的這張表添加表鎖。在可重復(fù)讀的事務(wù)級別下,給事務(wù)操作的這張表添加 Next-key Lock(Record Lock+Gap Lock)總結(jié)

看到這,你對事務(wù)是否已經(jīng)有了清晰的認(rèn)識?接下來我們就簡單總結(jié)下今天的知識點(diǎn):

事務(wù)的概念:一個事情由n個單元組成,這n個單元在執(zhí)行過程中,要么同時成功,要么同時失敗,這就把n個單元放在了一個事務(wù)之中。事務(wù)的特性:ACID事務(wù)的操作:開啟事務(wù)、提交事務(wù)、回滾事務(wù)事務(wù)的隔離級別:讀未提交、讀已提交、可重復(fù)讀、串行化解決幻讀的方法:鎖機(jī)制和MVCC機(jī)制

以上就是一文帶你徹底了解MySQL事務(wù)機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于MySQL事務(wù)機(jī)制的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 日韩欧美视频一区二区 | 天天爱天天做天天爽天天躁 | 玖玖玖精品视频免费播放 | 久久国产午夜精品理论片34页 | 日韩不卡一级毛片免费 | 久久久久欧美国产精品 | 深夜福利视频在线观看免费视频 | 九九国产在线视频 | 国产日本欧美高清免费区 | 免费区欧美一级毛片精品 | 真实国产普通话对白乱子子伦视频 | 日韩欧美一区二区三区久久 | 精品国产美女福到在线不卡f | 精品国产免费人成在线观看 | 亚久久伊人精品青青草原2020 | 国产精品久久久久久久久久久不卡 | 手机看a | 国产精品青草久久久久福利99 | 一本久久综合 | 久草黄视频 | 波多野结衣中文无毒不卡 | 久久精品免费视频观看 | 日韩精品中文字幕一区二区三区 | 欧美一级专区免费大片野外交 | 欧美日韩一区二区在线观看视频 | 久久一区二区精品综合 | 一区二区三区欧美 | 欧美一级毛片免费高清aa | 另类专区国产在线视频 | 一区二区三区免费视频播放器 | 亚洲日本高清成人aⅴ片 | 国产欧美另类久久久品 | 一区二区三区四区产品乱码伦 | 99re在线精品视频 | 国产成人高清精品免费软件 | 99在线热视频只有精品免费 | 日本免费不卡在线一区二区三区 | 久久高清一级毛片 | 一级毛片播放 | 手机在线国产精品 | 免费观看欧美一级牲片一 |