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

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

 更新時(shí)間:2023年06月20日 09:42:25   作者:阿Q說(shuō)代碼  
一個(gè)事情由n個(gè)單元組成,這n個(gè)單元在執(zhí)行過(guò)程中,要么同時(shí)成功,要么同時(shí)失敗,這就把n個(gè)單元放在了一個(gè)事務(wù)之中,這篇文章主要給大家詳細(xì)介紹MySQL的事務(wù)機(jī)制,感興趣的同學(xué)歡迎閱讀本文

我們?cè)O(shè)想一個(gè)場(chǎng)景,這個(gè)場(chǎng)景中我們需要插入多條相關(guān)聯(lián)的數(shù)據(jù)到數(shù)據(jù)庫(kù),不幸的是,這個(gè)過(guò)程可能會(huì)遇到下面這些問(wèn)題:

  • 數(shù)據(jù)庫(kù)中途突然因?yàn)槟承┰驋斓袅恕?/li>
  • 客戶(hù)端突然因?yàn)榫W(wǎng)絡(luò)原因連接不上數(shù)據(jù)庫(kù)了。
  • 并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),多個(gè)線程同時(shí)寫(xiě)入數(shù)據(jù)庫(kù),覆蓋了彼此的更改。

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

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

何謂事務(wù)?

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

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

事務(wù)的特性:ACID

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

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

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

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

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

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

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

:我們?cè)诓僮鲾?shù)據(jù)庫(kù)時(shí),事務(wù)提交或者回滾都會(huì)直接改變數(shù)據(jù)庫(kù)中的值。

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

事務(wù)的操作

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

# 開(kāi)啟一個(gè)事務(wù)
START TRANSACTION;
# 多條 SQL 語(yǔ)句
SQL1,SQL2...
## 提交事務(wù)
COMMIT;

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

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

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

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

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,此時(shí)讀取的結(jié)果和第一次讀取的結(jié)果不同。

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

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

不可重復(fù)讀和幻讀有什么區(qū)別

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

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

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

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

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

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

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

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

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

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

默認(rèn)隔離級(jí)別

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

# 開(kāi)啟一個(gè)事務(wù)
START TRANSACTION;
# 多條 SQL 語(yǔ)句
SQL1,SQL2...
## 提交事務(wù)
COMMIT;

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

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

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

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

解決幻讀的方法

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

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

總結(jié)

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

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

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

相關(guān)文章

  • mysql中Innodb 行鎖實(shí)現(xiàn)原理

    mysql中Innodb 行鎖實(shí)現(xiàn)原理

    InnoDB的行鎖是通過(guò)索引項(xiàng)加鎖實(shí)現(xiàn)的,分為使用索引和非索引字段檢索的情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • mysql之查找所有數(shù)據(jù)庫(kù)中沒(méi)有主鍵的表問(wèn)題

    mysql之查找所有數(shù)據(jù)庫(kù)中沒(méi)有主鍵的表問(wèn)題

    這篇文章主要介紹了mysql之查找所有數(shù)據(jù)庫(kù)中沒(méi)有主鍵的表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • CentOS 7搭建多實(shí)例MySQL8的詳細(xì)教程(想要幾個(gè)搞幾個(gè))

    CentOS 7搭建多實(shí)例MySQL8的詳細(xì)教程(想要幾個(gè)搞幾個(gè))

    這篇文章主要介紹了CentOS 7搭建多實(shí)例MySQL8的詳細(xì)教程(想要幾個(gè)搞幾個(gè)),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 禁止mysql做域名解析(解決遠(yuǎn)程訪問(wèn)mysql時(shí)很慢)

    禁止mysql做域名解析(解決遠(yuǎn)程訪問(wèn)mysql時(shí)很慢)

    當(dāng)遠(yuǎn)程訪問(wèn)mysql時(shí),mysql會(huì)解析域名,會(huì)導(dǎo)致訪問(wèn)速度很慢
    2010-04-04
  • MySQL庫(kù)操作和表操作詳細(xì)圖文教程

    MySQL庫(kù)操作和表操作詳細(xì)圖文教程

    在MySQL數(shù)據(jù)庫(kù)中表是一種很重要的數(shù)據(jù)庫(kù)對(duì)象,是組成數(shù)據(jù)庫(kù)的基本元素,由若干個(gè)字段組成,主要用來(lái)實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)記錄,這篇文章主要給大家介紹了關(guān)于MySQL庫(kù)操作和表操作的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • MySQL備份Shell腳本的實(shí)現(xiàn)

    MySQL備份Shell腳本的實(shí)現(xiàn)

    本文主要介紹了Shell腳本來(lái)自動(dòng)備份MySQL數(shù)據(jù)庫(kù),腳本會(huì)備份指定數(shù)據(jù)庫(kù)或所有數(shù)據(jù)庫(kù),按日期命名備份文件以防止覆蓋,并自動(dòng)刪除N天前的舊備份以節(jié)省空間,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Mysql元數(shù)據(jù)如何生成Hive建表語(yǔ)句注釋腳本詳解

    Mysql元數(shù)據(jù)如何生成Hive建表語(yǔ)句注釋腳本詳解

    這篇文章主要給大家介紹了關(guān)于Mysql元數(shù)據(jù)如何生成Hive建表語(yǔ)句注釋腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 詳解MySQL8中的新特性窗口函數(shù)

    詳解MySQL8中的新特性窗口函數(shù)

    MySQL8?窗口函數(shù)是一種特殊的函數(shù),它可以在一組查詢(xún)行上執(zhí)行類(lèi)似于聚合的操作,但是不會(huì)將查詢(xún)行折疊為單個(gè)輸出行,而是為每個(gè)查詢(xún)行生成一個(gè)結(jié)果,本文就來(lái)和大家簡(jiǎn)單講講它的用法,感興趣的可以了解一下
    2023-06-06
  • mysql存儲(chǔ)過(guò)程之if語(yǔ)句用法實(shí)例詳解

    mysql存儲(chǔ)過(guò)程之if語(yǔ)句用法實(shí)例詳解

    這篇文章主要介紹了mysql存儲(chǔ)過(guò)程之if語(yǔ)句用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過(guò)程中if語(yǔ)句相關(guān)原理、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • MySql 5.5.29綠色安裝教程詳解

    MySql 5.5.29綠色安裝教程詳解

    本文給大家介紹mysql5.5.29綠色安裝教程,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-01-01

最新評(píng)論