溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL事務(wù)隔離機制與實現(xiàn)原理是什么

發(fā)布時間:2022-11-14 16:48:41 來源:億速云 閱讀:299 作者:iii 欄目:MySQL數(shù)據(jù)庫

這篇“MySQL事務(wù)隔離機制與實現(xiàn)原理是什么”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL事務(wù)隔離機制與實現(xiàn)原理是什么”文章吧。

一、MySQL事務(wù)使用

1、什么是事務(wù)

事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。這些操作要么全部,要么沒有,是一個不可分割的工作單元。

例如,購買東西支付的過程中會有一系列操作,如查詢余額、加減、更新余額。這些操作必須是同時的。否則,顯示你支付成功,但是系統(tǒng)沒有收到錢

在MySQL中,事務(wù)支持是在引擎層實現(xiàn)的,MyISAM引擎不支持事務(wù)

2、事務(wù)的四個特性

要成為事務(wù),邏輯工作單元必須滿足關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的四個特征。

即所謂的ACID:原子性、一致性、隔離性、持久性。

原子性:事務(wù)的所有操作要么完成要么未完成,不會在中間階段結(jié)束。

一致性:在事務(wù)之前和之后,數(shù)據(jù)庫的完整性限制不會被打破。

隔離性:當(dāng)多個事務(wù)同時訪問數(shù)據(jù)庫中的同一數(shù)據(jù)時,將顯示關(guān)系。

持久性:事務(wù)完成后,事務(wù)所做的更改將持久保存,不會丟失。

ACID 需要通過 Redo 和 Undo 日志來保證。MySQL日志系統(tǒng)詳解:(后續(xù)補充)

3、MySQL事務(wù)使用

MySQL 的事務(wù)啟動方式有以下2種:

3.1、顯式啟動事務(wù)語句

begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback。

BEGIN -- 開啟事務(wù)
START TRANSACTION -- 開啟事務(wù)

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事務(wù)

ROLLBACK -- 回滾事務(wù)

3.2、關(guān)閉自動提交

set autocommit=0,這個命令會將這個線程的自動提交關(guān)掉。意味著如果你只執(zhí)行一個 select 語句,這個事務(wù)就啟動了,而且并不會自動提交。這個事務(wù)持續(xù)存在直到你主動執(zhí)行 commit 或 rollback 語句,或者斷開連接。(不建議使用?。?/p>

set autocommit=0 -- 關(guān)閉自動提交

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事務(wù)

ROLLBACK -- 回滾事務(wù)

二、MySQL事務(wù)隔離性與隔離機制

當(dāng)在數(shù)據(jù)庫上同時執(zhí)行多個事務(wù)(可以理解為多任務(wù)、并發(fā)場景)時,可能會發(fā)生臟讀、不可重復(fù)讀和幻讀。

1、四種隔離級別

為了解決這些問題,MySQL 引入了“隔離級別”的概念。

隔離級別越高,效率就越低,很多時候,我們必須在兩者之間找到平衡。SQL標(biāo)準(zhǔn)的事務(wù)隔離級別包括:讀(?。┪刺峤唬╮ead uncommitted)、讀(?。┮烟峤唬╮ead committed)、可重復(fù)讀取(repeatable read)和串行化(serializable )。

讀未提交RU,Read Uncommitted),它可以讀取事務(wù)的中間過程。它違反了ACID特性,并且存在臟讀取的問題。因此基本上不被使用,可以被忽略。

讀已提交RC,Read Committed),這意味著,如果已經(jīng)提交了其他事務(wù),我們可以看到這也是最常用的級別。然而,由于一些歷史原因,RC可能在生產(chǎn)環(huán)境中使用不多。

可重復(fù)讀RR,Repeatable Read)是目前使用最廣泛的級別。它的特點是間隙鎖定,這仍然是默認(rèn)級別。在這個級別,死鎖、低并發(fā)和其他問題經(jīng)常發(fā)生。

串行化(serializable ),不是多版本實現(xiàn),而是單版本實現(xiàn),因為它的所有實現(xiàn)都是通過鎖實現(xiàn)的。基本上不被使用,可以被忽略。

2、并發(fā)事務(wù)引起的問題

臟讀:事務(wù)A讀取事務(wù)B更新的數(shù)據(jù),然后B回滾,因此A讀取的數(shù)據(jù)是臟的(實際上不應(yīng)該存在的數(shù)據(jù))

不可重復(fù)讀:事務(wù)A多次讀取相同的數(shù)據(jù)。事務(wù)B在事務(wù)A多次讀取的過程中更新并提交數(shù)據(jù),導(dǎo)致事務(wù)A多次捕獲同一數(shù)據(jù)時結(jié)果不一致。

一個事務(wù)讀取到其他事務(wù)已提交的數(shù)據(jù)導(dǎo)致前后兩次讀取數(shù)據(jù)不一樣的情況

幻讀:A查出來數(shù)據(jù),此時B提交,A再次查同一數(shù)據(jù)時結(jié)果不一致。一個事務(wù)前后兩次讀取的數(shù)據(jù)不一致,是因為其他事務(wù)插入數(shù)據(jù)導(dǎo)致的事務(wù)并發(fā)情況

不可重復(fù)讀和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,而幻讀側(cè)重于添加或刪除。要解決不可重復(fù)讀取的問題,只需要,符合條件的行,而要解決幻讀問題需要鎖表。

3、隔離級別問題剖析與演示

MySQL事務(wù)隔離機制與實現(xiàn)原理是什么

3.1 查看mysql事務(wù)隔離級別

SELECT @@transaction_isolation; -- 查看mysql事務(wù)隔離級別
SELECT @@tx_isolation;          -- 查看mysql事務(wù)隔離級別

3.2、臟讀問題

將事務(wù)隔離級別修改為讀未提交,可以看到,事務(wù)還沒有提交,這時候去查詢這條數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)可見了。

MySQL事務(wù)隔離機制與實現(xiàn)原理是什么

set session transaction isolation level read uncommitted; -- 設(shè)置成讀未提交
SELECT @@tx_isolation;          -- 查看mysql事務(wù)隔離級別

START TRANSACTION -- 事務(wù)A
INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );
ROLLBACK

select * from fork_business_detail where id= 4 -- 事務(wù)B

3.3、不可重復(fù)讀

一個事務(wù)讀取到其他事務(wù)已提交的數(shù)據(jù)導(dǎo)致前后兩次讀取數(shù)據(jù)不一樣的情況。

MySQL事務(wù)隔離機制與實現(xiàn)原理是什么

select * from fork_business_detail where id= 4;

BEGIN; -- 開啟事務(wù)
select * from fork_business_detail where id= 4;
UPDATE fork_business_detail set SUB_ODR_ID=123004 where id= 4;
COMMIT;

select * from fork_business_detail where id= 5;

三、MySQL事務(wù)實現(xiàn)原理

1、單版本控制——鎖

serializable ,使用鎖獨占方式來確保只有一個版本時事務(wù)被隔離,因此鎖可以理解為單版本控制。

在MySQL事務(wù)中,鎖的實現(xiàn)與隔離級別有關(guān)。在RR(Repeatable Read)隔離級別下,MySQL使用間隙鎖來防止以并行性為代價寫入數(shù)據(jù),以解決虛擬讀取的問題。

這種類型的鎖通常會導(dǎo)致死鎖,因為它沒有足夠的并行性和許多沖突?,F(xiàn)在流行的Row模式可以避免許多沖突甚至死鎖,因此建議默認(rèn)使用Row+RC(Read Committed)模式隔離級別,這可以大大提高數(shù)據(jù)庫的讀寫并行性。

2、多版本控制MVCC

多版本控制,也稱為MVCC,是指數(shù)據(jù)的多版本處理,以實現(xiàn)數(shù)據(jù)庫中的高度并發(fā)數(shù)據(jù)訪問,以及事務(wù)的可見性,以確保事務(wù)可以看到其應(yīng)該看到的數(shù)據(jù)版本。

如何生成多個版本?

每次修改數(shù)據(jù)庫時,撤消( Undo log)日志都會記錄當(dāng)前修改記錄的事務(wù)號和修改前數(shù)據(jù)狀態(tài)的存儲地址(即ROLL_PTR),以便在必要時回滾舊數(shù)據(jù)版本。

例如,讀取事務(wù)查詢當(dāng)前記錄,但最近的事務(wù)尚未提交。根據(jù)原子性,讀取事務(wù)無法看到最新的數(shù)據(jù),但您可以在回滾段中找到舊版本數(shù)據(jù),從而生成多個版本。

多版本控制巧妙地將獨占和獨占的稀有資源轉(zhuǎn)換為并發(fā),大大提高了數(shù)據(jù)庫吞吐量和讀/寫性能。

以上就是關(guān)于“MySQL事務(wù)隔離機制與實現(xiàn)原理是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI