亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

MySQL事務隔離機制與實現原理是什么

發布時間:2022-11-14 16:48:41 來源:億速云 閱讀:307 作者:iii 欄目:MySQL數據庫

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

一、MySQL事務使用

1、什么是事務

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

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

在MySQL中,事務支持是在引擎層實現的,MyISAM引擎不支持事務

2、事務的四個特性

要成為事務,邏輯工作單元必須滿足關系數據庫管理系統中的四個特征。

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

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

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

隔離性:當多個事務同時訪問數據庫中的同一數據時,將顯示關系。

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

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

3、MySQL事務使用

MySQL 的事務啟動方式有以下2種:

3.1、顯式啟動事務語句

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

BEGIN -- 開啟事務
START TRANSACTION -- 開啟事務

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 -- 提交事務

ROLLBACK -- 回滾事務

3.2、關閉自動提交

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

set autocommit=0 -- 關閉自動提交

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 -- 提交事務

ROLLBACK -- 回滾事務

二、MySQL事務隔離性與隔離機制

當在數據庫上同時執行多個事務(可以理解為多任務、并發場景)時,可能會發生臟讀、不可重復讀和幻讀。

1、四種隔離級別

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

隔離級別越高,效率就越低,很多時候,我們必須在兩者之間找到平衡。SQL標準的事務隔離級別包括:讀(取)未提交(read uncommitted)、讀(取)已提交(read committed)、可重復讀取(repeatable read)和串行化(serializable )。

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

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

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

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

2、并發事務引起的問題

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

不可重復讀:事務A多次讀取相同的數據。事務B在事務A多次讀取的過程中更新并提交數據,導致事務A多次捕獲同一數據時結果不一致。

一個事務讀取到其他事務已提交的數據導致前后兩次讀取數據不一樣的情況

幻讀:A查出來數據,此時B提交,A再次查同一數據時結果不一致。一個事務前后兩次讀取的數據不一致,是因為其他事務插入數據導致的事務并發情況

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

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

MySQL事務隔離機制與實現原理是什么

3.1 查看mysql事務隔離級別

SELECT @@transaction_isolation; -- 查看mysql事務隔離級別
SELECT @@tx_isolation;          -- 查看mysql事務隔離級別

3.2、臟讀問題

將事務隔離級別修改為讀未提交,可以看到,事務還沒有提交,這時候去查詢這條數據,發現數據已經可見了。

MySQL事務隔離機制與實現原理是什么

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

START TRANSACTION -- 事務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 -- 事務B

3.3、不可重復讀

一個事務讀取到其他事務已提交的數據導致前后兩次讀取數據不一樣的情況。

MySQL事務隔離機制與實現原理是什么

select * from fork_business_detail where id= 4;

BEGIN; -- 開啟事務
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事務實現原理

1、單版本控制——鎖

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

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

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

2、多版本控制MVCC

多版本控制,也稱為MVCC,是指數據的多版本處理,以實現數據庫中的高度并發數據訪問,以及事務的可見性,以確保事務可以看到其應該看到的數據版本。

如何生成多個版本?

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

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

多版本控制巧妙地將獨占和獨占的稀有資源轉換為并發,大大提高了數據庫吞吐量和讀/寫性能。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彩票| 青州市| 奉化市| 德清县| 桑植县| 界首市| 襄汾县| 左贡县| 清新县| 抚远县| 古交市| 石阡县| 临清市| 海晏县| 达州市| 新疆| 喜德县| 徐州市| 萨嘎县| 时尚| 康保县| 肥城市| 新乡市| 忻城县| 麻江县| 定安县| 乌兰县| 左贡县| 西峡县| 塔河县| 太原市| 沾益县| 龙里县| 神农架林区| 孟津县| 泽州县| 石屏县| 峡江县| 保亭| 通山县| 新竹县|