這篇“MySQL事務(wù)隔離機制與實現(xiàn)原理是什么”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL事務(wù)隔離機制與實現(xiàn)原理是什么”文章吧。
成都創(chuàng)新互聯(lián)公司是專業(yè)的會昌網(wǎng)站建設(shè)公司,會昌接單;提供網(wǎng)站設(shè)計制作、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行會昌網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。這些操作要么全部,要么沒有,是一個不可分割的工作單元。
例如,購買東西支付的過程中會有一系列操作,如查詢余額、加減、更新余額。這些操作必須是同時的。否則,顯示你支付成功,但是系統(tǒng)沒有收到錢
在MySQL中,事務(wù)支持是在引擎層實現(xiàn)的,MyISAM引擎不支持事務(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ù)補充)
MySQL 的事務(wù)啟動方式有以下2種:
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ù)
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ù)
當(dāng)在數(shù)據(jù)庫上同時執(zhí)行多個事務(wù)(可以理解為多任務(wù)、并發(fā)場景)時,可能會發(fā)生臟讀、不可重復(fù)讀和幻讀。
為了解決這些問題,MySQL 引入了“隔離級別”的概念。
隔離級別越高,效率就越低,很多時候,我們必須在兩者之間找到平衡。SQL標(biāo)準(zhǔn)的事務(wù)隔離級別包括:讀(取)未提交(read 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)的?;旧喜槐皇褂?,可以被忽略。
臟讀:事務(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ù)讀取的問題,只需要鎖,符合條件的行,而要解決幻讀問題需要鎖表。
SELECT @@transaction_isolation; -- 查看mysql事務(wù)隔離級別
SELECT @@tx_isolation; -- 查看mysql事務(wù)隔離級別
將事務(wù)隔離級別修改為讀未提交,可以看到,事務(wù)還沒有提交,這時候去查詢這條數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)可見了。
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
一個事務(wù)讀取到其他事務(wù)已提交的數(shù)據(jù)導(dǎo)致前后兩次讀取數(shù)據(jù)不一樣的情況。
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;
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ù)庫的讀寫并行性。
多版本控制,也稱為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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:MySQL事務(wù)隔離機制與實現(xiàn)原理是什么
分享地址:http://jinyejixie.com/article32/ggeopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計、手機網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)