久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

深入聊聊MySQL中的事務特性和實現原理

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

深入聊聊MySQL中的事務特性和實現原理

一、概念

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

二、事務的特性以及類型介紹

2.1 事務特性

深入聊聊MySQL中的事務特性和實現原理

原子性(atomicity)

事務的原子性指的是構成事務的所有操作要么全部執行成功,要么全部執行是失敗。

一致性(consistency)

事務的一致性指的是事務執行之前和執行之后,數據始終處于一致的狀態。

隔離性(isolation)

事務的隔離性指的是并發執行的兩個事務之間互不干擾,也就是說,一個事務執行的過程中是無法看到其他事務運行過程的中間狀態的。

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

持久性(duration)

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

2.2 兩種事務類型介紹

  • 本地事務
  • 分布式事務

本地事務

通常基于關系型數據庫控制的事務可以稱作為傳統事務或者本地事務。

本地事務的執行流程

深入聊聊MySQL中的事務特性和實現原理

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

  • 開始回話之后,客戶端發起開啟事務的指令;

  • 事務開始后,客戶端發送各種SQL語句處理數據;

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

  • 上述流程完成后,關閉會話。

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

本地事務的缺點在于:

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

三、并發事務會帶來的哪些問題?

深入聊聊MySQL中的事務特性和實現原理

更新丟失(臟寫)

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

舉個例子:

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

深入聊聊MySQL中的事務特性和實現原理

臟讀

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

深入聊聊MySQL中的事務特性和實現原理

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

不可重復讀

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

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

幻讀

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

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

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

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

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

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

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

四、MySQL事務的隔離級別

深入聊聊MySQL中的事務特性和實現原理

使用下面的命令可以查詢全局級別和會話級別的事務隔離級別:

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

深入聊聊MySQL中的事務特性和實現原理

五、多版本并發控制MVCC

Multi-Version Concurrency Control多版本并發控制,MVCC是一種并發控制的方法,一般在數據庫管理系統中,實現對數據庫的并發訪問。

MVCC比鎖的優勢

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

MVCC的實現原理

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

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

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

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

  • 查詢操作(SELECT)

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

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

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

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

事務B:

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

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

  • 插入操作(SELECT)

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

比如:向account表插入一條數據,同時MVCC的兩個版本號分別為create_versiondelete_versioncreate_version代表創建行的版本號,delete_version代表刪除行的版本號,另外還有一個事務ID字段,如下面所示:

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

對應的版本號信息如下表:

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

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

  • 更新操作(SELECT)

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

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

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

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

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

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

  • 刪除操作(SELECT)

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

DELETE FROM account WHERE id = 1001;
登錄后復制

對應MVCC機制下的刪除操作如下表所示:

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

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

六、總結

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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产一区亚洲| 美女福利一区二区三区| 日韩综合精品| 福利一区和二区| sm捆绑调教国产免费网站在线观看| 欧美aa在线视频| 九九九精品视频| 中文字幕在线视频久| 日韩成人综合| 久久久久九九精品影院| 国产一区二区三区四区| 日韩av片子| 色爱av综合网| 国产精品7m凸凹视频分类| 国产亚洲在线| 蜜臀久久99精品久久久久宅男| 日韩国产欧美三级| 精品国产亚洲一区二区三区大结局| 精品九九久久| 亚洲性色视频| 亚洲一级大片| 久久久久观看| 欧美二区视频| 日韩午夜视频在线| 人人精品久久| 国产不卡一区| 欧美日韩国产在线观看网站| 先锋影音久久久| 国产日产高清欧美一区二区三区| 精品国产亚洲日本| 欧美日韩国产在线一区| 日本精品在线播放| 黄色网一区二区| 亚洲欧洲午夜| 日本欧美一区二区在线观看| 久久久久久久欧美精品| 亚洲午夜电影| 日韩精品亚洲专区| 国产在线一区不卡| 国产高清一区| 欧美成人aaa| 亚州av乱码久久精品蜜桃| 欧美天堂一区| 91精品成人| 国产亚洲第一伦理第一区| 日韩成人亚洲| 欧美亚洲免费| 久久久国产精品一区二区中文| 亚洲三级网站| 久久影院资源站| 欧美日韩国产免费观看| 国产精品天堂蜜av在线播放| 欧美一区二区三区激情视频 | 亚洲国产日韩欧美在线| 日本成人手机在线| 亚洲天堂黄色| 国产日韩欧美一区| 午夜日韩福利| 精品国产午夜| 夜夜嗨一区二区三区| 欧美激情日韩| 老牛影视一区二区三区| 国产精品夜夜夜| 久久精品国内一区二区三区水蜜桃| 亚洲人成亚洲精品| 日韩国产欧美| 久久精品99久久久| 欧美午夜精品一区二区三区电影| 国产乱码精品一区二区三区四区 | av亚洲一区二区三区| 久久国产精品色av免费看| 韩国精品主播一区二区在线观看| 国产三级一区| 妖精视频成人观看www| 国产精品三p一区二区| 欧美精品一区二区久久| 精品一区视频| 亚洲精品伦理| 国产理论在线| 国产精品欧美三级在线观看| 尤物在线精品| xxxxx性欧美特大| 欧美亚洲国产日韩| 欧美专区在线| 欧美69视频| 成午夜精品一区二区三区软件| 综合日韩在线| 香蕉久久99| 精品女同一区二区三区在线观看| 日韩影院在线观看| 久久久蜜桃一区二区人| 国产精品网站在线看| 视频一区国产视频| 亚洲高清av| 中文字幕在线视频网站| 国产精品对白| 亚洲精品进入| 午夜国产精品视频| 日韩免费小视频| 精品一区视频| 国产精品主播| 亚洲精品影院在线观看| 91成人超碰| 欧美日一区二区| 在线一区av| 国产精品大片免费观看| 日韩中文字幕| 蜜桃视频第一区免费观看| 一区在线观看| 激情综合网五月| 日本欧美不卡| 丝袜美腿诱惑一区二区三区| 久久精品资源| 开心激情综合| 精品视频一区二区三区四区五区| 欧美久久久网站| 欧美日本久久| 欧美三区不卡| 国产欧美丝祙| 国产乱码精品| 日本在线视频一区二区| 伊人久久一区| 水野朝阳av一区二区三区| 激情欧美丁香| 国产亚洲精品v| 视频一区在线播放| 日韩一区精品字幕| 男人的天堂亚洲一区| 亚洲人成网77777色在线播放| 日本 国产 欧美色综合| 亚洲视频二区| 青草综合视频| 国产日韩高清一区二区三区在线| 国产欧美亚洲精品a| 欧美激情福利| 久久99视频| 久久精品日韩欧美| 国产成人久久精品一区二区三区| 精品不卡一区| 日韩欧美精品| 91精品国产91久久久久久黑人| 999久久久国产精品| 日韩精品免费一区二区在线观看| 久久久久久黄| 先锋影音久久久| 亚洲精品乱码日韩| 日本天堂一区| 精品亚洲成人| 群体交乱之放荡娇妻一区二区| 国产综合色产| 亚洲高清毛片| 免费精品视频| 天堂va欧美ⅴa亚洲va一国产| 91九色综合| 精品视频网站| 激情久久五月| 日本精品国产| 精品亚洲a∨一区二区三区18| a日韩av网址| 欧美日韩免费观看一区=区三区| 日韩中文字幕av电影| 国产伦乱精品| 成人久久久久| 久久亚洲一区| 国产精区一区二区| 美女尤物国产一区| 亚洲福利免费| 欧美日韩精品一区二区三区在线观看| 欧美国产先锋| 亚洲福利免费| 777久久精品| 日韩一区三区| 蜜臀久久99精品久久久久宅男| 国产精品久久久久久久久久妞妞 | 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日本在线一区二区三区| 国产免费av一区二区三区| av资源亚洲| 午夜精品影视国产一区在线麻豆| 国产精品115| 亚洲午夜电影| 国产精品久久久久毛片大屁完整版| 蜜臀国产一区| 亚洲a级精品| 日韩毛片视频| 日韩av不卡一区二区| 国产99精品| 开心激情综合| 久久不射中文字幕| 韩日一区二区| 欧美成人国产| 国产精品嫩模av在线| 99久久视频| 国产精品任我爽爆在线播放 | 麻豆精品蜜桃| 日韩成人精品一区二区三区 | 在线日韩成人| 午夜av成人| 国产日产一区| 国产资源在线观看入口av|