成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

本篇文章帶大家聊聊MySQL中的事務(wù)特性,介紹一下多版本并發(fā)控制MVCC實現(xiàn)原理,希望對大家有所幫助!

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

一、概念

事務(wù) 一般指的是邏輯上的一組操作,或者作為單個邏輯單元執(zhí)行的一系列操作,一個事務(wù)中的所有操作會被封裝成一個不可分割的執(zhí)行單元,這個單元的所有操作要么全部執(zhí)行成功,要么全部執(zhí)行失敗,只要其中任意一個操作執(zhí)行失敗,整個事務(wù)就會執(zhí)行回滾操作。

二、事務(wù)的特性以及類型介紹

2.1 事務(wù)特性

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

原子性(atomicity)

事務(wù)的原子性指的是構(gòu)成事務(wù)的所有操作要么全部執(zhí)行成功,要么全部執(zhí)行是失敗。

一致性(consistency)

事務(wù)的一致性指的是事務(wù)執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)始終處于一致的狀態(tài)。

隔離性(isolation)

事務(wù)的隔離性指的是并發(fā)執(zhí)行的兩個事務(wù)之間互不干擾,也就是說,一個事務(wù)執(zhí)行的過程中是無法看到其他事務(wù)運行過程的中間狀態(tài)的。

?‍注意:MySQL是通過鎖個MVCC機制來保證事務(wù)的隔離性。

持久性(duration)

事務(wù)的持久性指的是一旦事務(wù)被提交后,此事務(wù)對數(shù)據(jù)的更改操作會被持久化到數(shù)據(jù)庫中,并且不會被回滾。

2.2 兩種事務(wù)類型介紹

  • 本地事務(wù)
  • 分布式事務(wù)

本地事務(wù)

通?;陉P(guān)系型數(shù)據(jù)庫控制的事務(wù)可以稱作為傳統(tǒng)事務(wù)或者本地事務(wù)。

本地事務(wù)的執(zhí)行流程

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

  • 客戶端開始事務(wù)操作之前,需要開啟一個連接回話;

  • 開始回話之后,客戶端發(fā)起開啟事務(wù)的指令;

  • 事務(wù)開始后,客戶端發(fā)送各種SQL語句處理數(shù)據(jù);

  • 正常情況下,客戶端會發(fā)起提交事務(wù)的指令,如果發(fā)生異常情況,客戶端會發(fā)起回滾事務(wù)命令;

  • 上述流程完成后,關(guān)閉會話。

✔本地事務(wù)是有資源管理器在本地進行管理的。

本地事務(wù)的缺點在于:

  • 不具備分布式事務(wù)的處理能力
  • 一次事務(wù)過程只能連接一個支持事務(wù)的數(shù)據(jù)庫,既不能用于多個事務(wù)性數(shù)據(jù)庫。

三、并發(fā)事務(wù)會帶來的哪些問題?

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

更新丟失(臟寫)

當兩個會在兩個以上的事務(wù)同時操作同一行數(shù)據(jù),并給予最初選定的值更新該行數(shù)據(jù)時,視為事務(wù)之間是無法感知彼此的存在的,所以會出現(xiàn)最后的更新操作會覆蓋之前其他事務(wù)完成的更新操作。

舉個例子:

張三的賬戶為100元,當前有兩個事務(wù):事務(wù)1和事務(wù)2,事務(wù)1是將張三賬戶余額增加100元,事務(wù)2是將張三余額增加200,起初事務(wù)1和事務(wù)2同時讀到張三的賬戶余額都是100元,然后事務(wù)1和事務(wù)2分別更新張三月,假設(shè)事務(wù)1先于事務(wù)2提交,但是最近兩個事務(wù)都提交后張三的余額為300元(正常情況應(yīng)該是400元),也就是說:后提交的事務(wù)2覆蓋了事務(wù)1的更新操作,這就是所謂的更新丟失,更新丟失(臟寫)本質(zhì)上是寫操作的沖突,然而解決臟寫的方式是讓每個事務(wù)串行方式執(zhí)行,保證事務(wù)按照一定的順序執(zhí)行寫操作。

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

臟讀

一個事務(wù)讀取到另一個事務(wù)未提交的數(shù)據(jù)。比如:事務(wù)1正在對張三的余額增加100元,在這個事務(wù)沒提交之前,另一個事務(wù)2讀取了正在修改的這條數(shù)據(jù),如果沒有事務(wù)的控制下,第二條事務(wù)就會讀取到?jīng)]有被提交的臟數(shù)據(jù),并且對臟數(shù)據(jù)叢下一步的處理,此時就會產(chǎn)生未提交數(shù)據(jù)的依賴關(guān)系,通常這種現(xiàn)象被稱為 臟讀,也就是說:臟讀是一個事務(wù)讀取了另一個事務(wù)沒提交的數(shù)據(jù)。

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

?臟讀本質(zhì)上是讀寫操作的沖突,解決方法是先寫后讀,也就是寫完之后再讀。

不可重復(fù)讀

一個事務(wù)讀取了某些數(shù)據(jù),在一段時間后,這個事務(wù)再次讀取之前讀過的數(shù)據(jù),此時發(fā)現(xiàn)讀取的數(shù)據(jù)發(fā)生了變化,或者其中某些數(shù)據(jù)記錄已經(jīng)被刪除,這種現(xiàn)象被稱為:不可重復(fù)讀,即同一個事務(wù),使用同樣的查詢語句,在不同時刻讀取到的結(jié)果不一致。

不可重復(fù)讀的本質(zhì)上也是讀寫操作沖突,解決方法是先讀后寫,也就是讀完之后再寫。

幻讀

一個事務(wù)按照相同的查詢條件重新讀取之前讀過的數(shù)據(jù),此時發(fā)現(xiàn)其他事務(wù)插入了滿足當前查詢條件的新數(shù)據(jù),數(shù)據(jù)結(jié)果集變多,這種現(xiàn)象稱為幻讀,即一個事務(wù)兩次讀取一個范圍的數(shù)據(jù)記錄,兩次讀到的結(jié)果不同。

幻讀的本質(zhì)上也是讀寫操作沖突,解決方法是先讀后寫,也就是讀完之后再寫。

那到這里,很多小伙伴就有疑問,同樣本質(zhì)都是讀寫操作沖突,解決方法是先讀后寫,不可重復(fù)讀和幻讀到底有何區(qū)別?,我下面見簡單解釋一下:

  • 1️⃣ 不可重復(fù)讀的重點在于更新和刪除操作,而幻讀的重點在于插入操作。

  • 2️⃣ MySQL使用鎖機制實現(xiàn)事務(wù)的隔離級別時,在可重復(fù)讀隔離級別中,SQL語句第一個讀取到數(shù)據(jù)后,會將相應(yīng)的數(shù)據(jù)加鎖,使得其他事務(wù)無法修改和刪除這些數(shù)據(jù),通過鎖的方式實現(xiàn)可重復(fù)讀。但是這種方法無法對新數(shù)據(jù)的插入加鎖,如果事務(wù)1讀取了數(shù)據(jù),或者修改和刪除了數(shù)據(jù),事務(wù)2還可以進行插入操作,導(dǎo)致事務(wù)1莫名其妙地多了一條之前沒有的數(shù)據(jù),這就是幻讀。

  • 3️⃣ 所以,幻讀是無法通過鎖機制來避免,需要使用串行化的事務(wù)隔離級別,但是這種事務(wù)隔離級別會大大降低數(shù)據(jù)庫的并發(fā)能力。

✔MySQL是通過MVCC(多版本并發(fā)控制)機制來避免不可重復(fù)讀和幻讀的。

四、MySQL事務(wù)的隔離級別

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

使用下面的命令可以查詢?nèi)旨墑e和會話級別的事務(wù)隔離級別:

# 默認數(shù)據(jù)庫的事務(wù)隔離級別為:可重復(fù)讀(REPEATABLE-READ) SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation;
登錄后復(fù)制

深入聊聊MySQL中的事務(wù)特性和實現(xiàn)原理

五、多版本并發(fā)控制MVCC

Multi-Version Concurrency Control多版本并發(fā)控制,MVCC是一種并發(fā)控制的方法,一般在數(shù)據(jù)庫管理系統(tǒng)中,實現(xiàn)對數(shù)據(jù)庫的并發(fā)訪問。

MVCC比鎖的優(yōu)勢

可以將MVCC看成行級別鎖的一種妥協(xié),它在許多情況下避免了使用鎖,同時可以提供更小的開銷。根據(jù)實現(xiàn)的不同,它可以允許非阻塞式讀,在寫操作進行時只鎖定必要的記錄。

MVCC的實現(xiàn)原理

MVCC的是通過保存數(shù)據(jù)澡某個時間點的快照來實現(xiàn)的,也就是說,不管事務(wù)執(zhí)行多長的時間,每個事務(wù)看到的數(shù)據(jù)都是一致的。根據(jù)事務(wù)的開始時間不同,每個事務(wù)對同一張表,同一時刻看到的數(shù)據(jù)可能是不一樣的。InnonDB主要通過為每一行記錄添加兩個額外的隱藏的值來實現(xiàn)MVCC,這兩個值一個記錄這行數(shù)據(jù)何時被創(chuàng)建,另外一個記錄這行數(shù)據(jù)何時過期(或者被刪除)。但是InnoDB并不存儲這些事件發(fā)生時的 實際時間 ,相反它只存儲這些事件發(fā)生時的系統(tǒng) 版本號(version) 。這是一個隨著事務(wù)的創(chuàng)建而不斷增長的數(shù)字。每個事務(wù)在事務(wù)開始時會記錄它自己的系統(tǒng)版本號。每個查詢必須去檢查每行數(shù)據(jù)的版本號與事務(wù)的版本號是否相同。

《高性能MySQL》書籍中介紹到:

MVCC只在REPEATABLE READREAD COMMITTIED兩個隔離級別下工作,其他兩個隔離級別都和MVCC不兼容,因為READ UNCOMMITTED總是讀取最新的數(shù)據(jù)行,而不符合當前事務(wù)版本數(shù)據(jù)行,而SERIALIZABLE串行化隔離級別則會對所有讀取的行都加鎖。

接下來舉個例子說明在可重復(fù)讀事務(wù)隔離級別下,MVCC機制是如何完成增刪改查操作的。

  • 查詢操作(SELECT)

在查詢操作中,InnoDB存儲引擎跟根據(jù)以下兩個條件查詢對應(yīng)的行記錄,只有滿足對應(yīng)條件才會被返回:

1️⃣ 只查找不晚于當前事務(wù)版本的數(shù)據(jù)行,也就是說,InnoDB存儲引擎只會查找版本號小于或者等于當前事務(wù)版本的數(shù)據(jù)行,這些數(shù)據(jù)行要么在該事務(wù)開始前就存在,要么就是事務(wù)本身插入或者更新的行。
2️⃣ 對于數(shù)據(jù)刪除,數(shù)據(jù)行刪除的版本要么還沒有被定義,要么大于當前事務(wù)的版本號,只有這樣才能確保事務(wù)讀到的行,在事務(wù)開始前并沒有被刪除。

舉個例子,存在 事務(wù)A事務(wù)B 兩個事務(wù),事務(wù)A中存在兩套相同的SELECT語句,事務(wù)B存在一條UPDATE語句,事務(wù)A 的第一條查詢語句在事務(wù)B提交之前執(zhí)行,第二條查詢語句在 事務(wù)B 提交之后執(zhí)行,事務(wù)A 如下所示:

-- 事務(wù)A操作 START TRANSACTION; SELECT * FROM account WHERE id = 1;     //在事務(wù)B提交之前執(zhí)行 SELECT * FROM account WHERE id = 1;     //在事務(wù)B提交之后執(zhí)行 COMMIT;
登錄后復(fù)制

事務(wù)B:

-- 事務(wù)B操作 START TRANSACTION; UPDATE account SET balance = balance+100 WHERE id = 1; COMMIT;
登錄后復(fù)制

✔結(jié)論:如果沒有使用MVCC機制,則事務(wù)A中的第一條SELECT語句讀取的數(shù)據(jù)是修改前的數(shù)據(jù),而第二條SELECT語句讀取的是修改后的數(shù)據(jù),兩次讀取的數(shù)據(jù)不一致,想想,那不就亂了嗎?? 如果使用了MVCC機制,無論事務(wù)B如何修改數(shù)據(jù),事務(wù)A的兩條查詢語句的到的結(jié)果始終是一致的。

  • 插入操作(SELECT)

在插入操作中,InnoDB會將新插入的每一條行記錄的當前系統(tǒng)版本包保存為行版本號。

比如:向account表插入一條數(shù)據(jù),同時MVCC的兩個版本號分別為create_versiondelete_version,create_version代表創(chuàng)建行的版本號,delete_version代表刪除行的版本號,另外還有一個事務(wù)ID字段,如下面所示:

INSERT INTO account(id, name, balance) values(1001, 'austin', 100);
登錄后復(fù)制

對應(yīng)的版本號信息如下表:

id name balance transaction_id create_version delete_version
1001 austin 100 1 1 未定義

可以看出,當向數(shù)據(jù)表新增記錄時,需要設(shè)置保存行的版本號,而刪除行的版本號未定義。

  • 更新操作(SELECT)

在更新操作中,InnoDB存儲引擎會插入一行新記錄,并保存當前系統(tǒng)的版本號為新記錄行的版本號,同時保存當前系統(tǒng)的版本號到原來數(shù)據(jù)行作為刪除標識。比如:將account數(shù)據(jù)表中id為1001的用戶賬戶月增加100元,對應(yīng)SQL如下:

UPDATE account SET balance = balance+100 WHERE id = 1001;
登錄后復(fù)制

執(zhí)行SQL, 在MVCC機制下的更新操作如下表所示:

id name balance transaction_id create_version delete_version
1001 austin 100 1 1 2
1001 austin 200 2 2 未定義

可以明顯看出,執(zhí)行更新操作時,MVCC機制是先將原來的數(shù)據(jù)復(fù)制一份,將balance字段增加100后,再講create_version字段的值設(shè)置為當前系統(tǒng)的版本號,而delete_version字段的值未定義。

注意的是:原來的行會被復(fù)制到Undo Log中。

  • 刪除操作(SELECT)

在刪除操作中,InnoDB存儲引擎會保存刪除的每一個行記錄當前的系統(tǒng)版本號,作為刪除標識。比如:刪除account數(shù)據(jù)表中id為1001的數(shù)據(jù),SQL如下所示:

DELETE FROM account WHERE id = 1001;
登錄后復(fù)制

對應(yīng)MVCC機制下的刪除操作如下表所示:

id name balance transaction_id create_version delete_version
1001 austin 200 3 2 3

可以看出,當刪除數(shù)據(jù)表數(shù)據(jù)行時,MVCC機制會將當前系統(tǒng)的版本號寫入刪除數(shù)據(jù)行版本字段delete_version中,以此來表示當前數(shù)據(jù)行已經(jīng)被刪除。

六、總結(jié)

本文主要講述了事務(wù)的特性、類型和本地事務(wù)和分布式事務(wù)的區(qū)別,通過不同的示例解釋并發(fā)事務(wù)帶來的更新丟失、臟讀、不可重復(fù)讀、幻讀的問題,同時介紹了多版本并發(fā)控制MVCC的實現(xiàn)原理,如果文章對你有幫助,感謝點贊?+評論?+收藏❤,我是:?‍?austin流川楓,我們下期見!

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
高潮潮喷奶水飞溅视频无码| 干的你走不了路SB| 宝贝腿开大一点你真湿H| 成人免费无码大片A毛片直播| 亚洲AV无码国产精品色午友在线| 特黄AAAAAAAAA毛片免费| 无码人妻品一区二区三区精99 | 99999久久久久久亚洲| JAVAPARSER教师HD| 高清欧美精品XXXXX在线看| 国产猛男GAY1069视频| 精品国模一区二区三区| 麻豆传煤入口免费进入2023| 欧美综合天天夜夜久久| 色欲麻豆国产福利精品| 亚洲 精品 制服 校园 无码| 要灬要灬再深点受不了好舒服| 18禁美女裸体无遮挡免费观看国| 尝到了甜头两人每天都会想方设法| 国产成人精品视频ⅤA秋霞影院 | 亚洲AV综合色区无码另类小说| 亚洲熟妇丰满美女XXXXX| 94久久国产乱子伦精品免费| 大号BBVVBBW高潮| 狠狠久久亚洲欧美专区| 末成年女AV片一区二区| 色婷婷亚洲一区二区综合| 亚洲AV无码成人精品区在线h | 亚洲AV综合色一区二区三区 | 亚洲精品AⅤ无码精品丝袜足| 中国自产一战二战三战来源 | 搡BBB搡BBBB搡BBBB| 亚洲А∨天堂久久精品2021 | 国产超薄肉色丝袜视频| 精品无人区一线二线三线区别 | JAPANESE极品丰满少妇| 国产日产欧产精品精品APP| 老妇饥渴XXHDⅩXXOOO| 色爽黄1000部免费软件下载| 亚洲国产精品VA在线观看麻豆 | 亚洲人成人无码.WWW石榴| А√天堂中文最新版在线下载种子| 国产人澡人澡澡澡人碰视| 免费影视观看网站入口| 无码H黄肉动漫在线观看| 曰韩精品无码一区二区三区视频| 东京热一区二区三区无码视频| 精品亚洲AⅤ无码午夜在线| 青草国产超碰人人添人人碱| 亚洲AV鲁丝一区二区三区| AV国内精品久久久久影院| 国产熟睡乱子伦视频| 欧美激情000ⅩXX同性| 亚洲AV无码潮喷在线观看| A级毛片毛片免费观看丝瓜| 国产无遮挡裸露视频免费| 欧美丰满少妇熟乱XXXXX视频| 无人区卡一卡二卡三乱码入口 | 欧美人与禽Z0ZO牲伦交| 亚洲AV无码成人精品区在线h| GAYFUCKⅩⅩⅩⅩHD激情| 好大好硬好深好爽想要20P| 欧洲美熟女乱又伦AV| 亚洲久悠悠色悠在线播放| 动漫AV纯肉无码AV在线播放| 浪荡人妻共32部黑人大凶器电影 | 狠狠做五月深爱婷婷天天综合| 人妻少妇精品无码专区动漫| 亚洲中文精品久久久久久| 国产成人无码久久久精品一| 免费少妇A级毛片| 亚洲AV无码成人影片在线观看| 班级每人C了我半小时班长| 久久久久波多野结衣高潮| 无码国产69精品久久久孕妇| AV天堂永久资源网亚洲高清| 久久国内精品一区二区三区| 婷婷五月六月综合缴情| JK女自慰下面爆浆喷水| 久久精品国产亚洲AV蜜桃| 无码综合天天久久综合网色吧影院| GOGO全球高清大尺度视频| 久久久久99精品成人片直播| 小寡妇好紧进去了好大看视频| 草莓丝瓜芭乐鸭脖奶茶发型 | 亲嘴扒胸摸屁股激烈网站| 人人添人人澡人人澡人人人人 | STEAMWORKSHOP魅魔| 久久久精品中文字幕乱码18| 无码少妇丰满熟妇一区二区| 宝贝把腿开大让我添添电影| 美女露 0的奶头无| 亚洲国产精品无码一线岛国| 国产精品久久久久这里只有精品| 人妻互换免费中文字幕| 中国无码人妻丰满熟妇啪啪软件| 精品国产一区二区三区吸毒| 午夜AV无码福利免费看网站| 成人无码免费一区二区三区| 欧美性XXXXX极品少妇| 男女作爱网站免费观看全过程| 试看20分钟做受| 老司机久久一区二区三区| 日本多人强伦姧人妻完整版| 亚洲日本一线产区和二线| 国产午夜精品一区二区三区老| 久久综合九色欧美综合狠狠| 亚洲精品无码不卡在线播HE| 国产精品一区二区国产馆蜜桃| 日日噜噜夜夜狠狠视频| А√在线天堂官网| 年轻的少妇A级伦理| 中文精品无码中文字幕无码专区| 久久精品日日躁夜夜躁| 亚洲高清成人AV电影网站| 国产日产欧产精品精品| 无码一区二区三区AⅤ免费麻豆| 丰满又黄又爽少妇毛片| 日本一区二区在线播放| 宝宝好大我都握不住了视频 | 伊人久久大香线蕉AV一区二区 | 亲近相奷对白中文字幕| 99无人区码一码二码三| 女生会把隐私透露给异性朋友| 18黑白丝水手服自慰喷水网站| 久久天天躁夜夜躁狠狠躁| 一边亲着一面膜下奶怎么回事| 久久精品人人看人人爽| 亚洲一区在线曰日韩在线| 久久99久久99小草精品免视看 | JAPANESE春药高潮| 强 暴 疼 哭 处 女| 按在阳台上疯狂的进入| 日本人妻丰满大屁股a v| 成人免费无码H黄网站WWW| 色惰日本视频网站WWW| 大波妺AV网站影院| 四虎成人精品一区二区免费网站| 国产 精品 自在自线| 天天躁夜夜躁狠狠是什么心态| 国产精品久久久久久久久软件| 无人区免费一二三四乱码| 国精产品W灬源码1688伊| 亚洲AV最新在线网址| 精品日本一区二区三区免费| 亚洲自偷自拍熟女另类| 老外粗猛长爽的视频| 久久久久久精品免费免费直播| ⅩXXⅩ互换人妻四人互换| 欧洲女RAPPER潮水大豆| 成人毛片18女人毛片免费视频末| 熟妇高潮一区二区精| 亚洲中文字幕久久精品蜜桃 | 免费久久99精品国产自在现| 97夜夜澡人人爽人人喊A| 人妻夜夜爽天天爽三区丁香花| 成人欧美一区二区三区在线 | 免费啪啪全程无遮挡60分钟| WWW国产成人免费观看视频| 色婷婷AV一区二区三区在线观看| 国产精华液一区二区区别大吗| 亚洲AV伊人久久青青草原| 久久久久精品午夜福利| 99RE6热这里只精品首页| 日本A级视频在线播放| 国产精品成人99一区无码| 亚洲精品第一国产综合麻豆| 美丽女邻居交换5完整版| ZOOM与人性ZOOM1区别| 雯雅婷在工地被民工玩| 精品国产A∨无码一区二区三区| 永久免费AV网站可以直接看的| 漂亮人妻被中出中文字幕| 国产寡妇XXXX猛交| 亚洲日韩成人无码不卡| 欧美人C交ZOOZOOXX| 国产SM残忍打屁股调教视频| 亚洲精品无码AV人在线观看| 男女啪啪免费观看的网址| 大象成品W灬源码1| 亚洲国产成人精品无码区在线观看 | 在线看片无码永久免费AV| 人人爽人人爽人人片A∨不卡| 国产午夜片无码区在线观看爱情网 | 呦女IUU极品资源| 日本最新高清一区二区三 | 疯狂做受XXXX国产| 亚洲精品又大又粗| 欧美日韩亚洲中文字幕二区| 国产精品爽爽V在线观看无码 | 亚洲AV无码兔费综合在线观看| 成人综合伊人五月婷久久| 掀开老师的裙子挺进去| 毛卡5卡6卡7卡8入口| 福建妹妹幼儿十岁左右| 亚洲无人区码一二三四区别| 人妻中文乱码在线网站| 极品少妇被黑人白浆直流| А√天堂资源中文最新版地址| 亚洲成在人线AⅤ中文字幕|