真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)公司是專業(yè)的會(huì)昌網(wǎng)站建設(shè)公司,會(huì)昌接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行會(huì)昌網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

一、MySQL事務(wù)使用

1、什么是事務(wù)

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

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

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

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

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

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

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

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

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

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

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

3、MySQL事務(wù)使用

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

3.1、顯式啟動(dòng)事務(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)閉自動(dòng)提交

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

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

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ù)隔離性與隔離機(jī)制

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

1、四種隔離級(jí)別

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

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

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

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

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

串行化(serializable ),不是多版本實(shí)現(xiàn),而是單版本實(shí)現(xiàn),因?yàn)樗乃袑?shí)現(xiàn)都是通過鎖實(shí)現(xiàn)的。基本上不被使用,可以被忽略。

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

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

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

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

幻讀:A查出來數(shù)據(jù),此時(shí)B提交,A再次查同一數(shù)據(jù)時(shí)結(jié)果不一致。一個(gè)事務(wù)前后兩次讀取的數(shù)據(jù)不一致,是因?yàn)槠渌聞?wù)插入數(shù)據(jù)導(dǎo)致的事務(wù)并發(fā)情況

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

3、隔離級(jí)別問題剖析與演示

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

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

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

3.2、臟讀問題

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

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

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

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ù)讀

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

MySQL事務(wù)隔離機(jī)制與實(shí)現(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ù)實(shí)現(xiàn)原理

1、單版本控制——鎖

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

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

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

2、多版本控制MVCC

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

如何生成多個(gè)版本?

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

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

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

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


本文題目:MySQL事務(wù)隔離機(jī)制與實(shí)現(xiàn)原理是什么
瀏覽地址:http://weahome.cn/article/ggeopc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部