自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文講清,MySQL事務(wù)隔離級(jí)別

數(shù)據(jù)庫(kù) MySQL
業(yè)務(wù)系統(tǒng)在運(yùn)行的時(shí)候,往往有很多線程同時(shí)在操作數(shù)據(jù)庫(kù),MySQL也需要多線程的處理多個(gè)請(qǐng)求,那么每個(gè)事務(wù)里的多個(gè)SQL語(yǔ)句是如何執(zhí)行的呢?

業(yè)務(wù)系統(tǒng)在運(yùn)行的時(shí)候,往往有很多線程同時(shí)在操作數(shù)據(jù)庫(kù),MySQL也需要多線程的處理多個(gè)請(qǐng)求,那么每個(gè)事務(wù)里的多個(gè)SQL語(yǔ)句是如何執(zhí)行的呢?

基本都是從磁盤加載數(shù)據(jù)頁(yè)到Buffer Pool的緩存頁(yè)里去,然后更新Buffer Pool里的緩存頁(yè),同時(shí)記錄redo log和undo log。

 

 

 

 

多個(gè)線程并發(fā)執(zhí)行的時(shí)候,會(huì)有一些問(wèn)題:

多個(gè)事務(wù)并發(fā)執(zhí)行,可能會(huì)對(duì)緩存頁(yè)里的同一行數(shù)據(jù)進(jìn)行更新,這種沖突怎么解決?

有的事務(wù)在對(duì)一行數(shù)據(jù)進(jìn)行更新,另一個(gè)事務(wù)在對(duì)這行數(shù)據(jù)進(jìn)行查詢,這個(gè)沖突怎么解決?

接下來(lái)要講的內(nèi)容,主要包括多事務(wù)并發(fā)運(yùn)行存在的問(wèn)題、MySQL的事務(wù)隔離級(jí)別、MVCC多版本控制、鎖。

臟讀

事務(wù)1讀取了事務(wù)2更新的數(shù)據(jù),然后事務(wù)2回滾操作,那么事務(wù)1讀取到的數(shù)據(jù)就是臟數(shù)據(jù)。

例如:

張三的工資是8000,現(xiàn)在領(lǐng)導(dǎo)要給他漲工資到10000。

事務(wù)1把他的工資改為10000,但事務(wù)還沒提交。

事務(wù)2正在讀取張三的工資,獨(dú)到的是10000。

事務(wù)1此時(shí)回滾了,張三的工資又變成8000了。

事務(wù)2讀取到張三的工資10000為臟數(shù)據(jù),事務(wù)2做了一次臟讀。

不可重復(fù)讀

事務(wù)1多次讀取同一數(shù)據(jù),事務(wù)2在事務(wù)1多次讀取的過(guò)程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)1多次讀取同一數(shù)據(jù)時(shí),結(jié)果不一致。

例如:

事務(wù)1,讀取到張三的工資8000。

事務(wù)2,把張三的工資改為10000,提交事務(wù)。

事務(wù)1,再次讀取張三的工資,此時(shí)工資為10000。

在一個(gè)事務(wù)中前后兩次讀取同一個(gè)數(shù)據(jù)的結(jié)果不一樣,就是不可重復(fù)讀。

幻讀

一個(gè)事務(wù)用一樣的SQL多次查詢,每次查詢發(fā)現(xiàn)查到一些之前沒看到過(guò)的數(shù)據(jù)。

比如,目前公司工資為8000的人有10人。

事務(wù)1,讀取所有工資為8000的人數(shù)為10人。

事務(wù)2,插入一條工資為10000的記錄。

事務(wù)1再次讀取工資為8000的人,為11人。

此時(shí),事務(wù)1出現(xiàn)幻覺似的,同樣的SQL查詢語(yǔ)句,第一次查出來(lái)10人,第二次查出來(lái)11人。

不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問(wèn)題只需鎖住滿足條件的行,解決幻讀需要鎖表。

臟讀、不可重復(fù)讀、幻讀,數(shù)據(jù)庫(kù)并發(fā)執(zhí)行,每個(gè)線程可能會(huì)開啟一個(gè)事務(wù),每個(gè)事務(wù)都會(huì)執(zhí)行crud操作。

數(shù)據(jù)庫(kù)并發(fā)的執(zhí)行多個(gè)事務(wù),多個(gè)事務(wù)并發(fā)的對(duì)緩存頁(yè)里的同一批數(shù)據(jù)進(jìn)行crud,就可能導(dǎo)致臟讀、不可重復(fù)讀、幻讀這些問(wèn)題。

所以,這些問(wèn)題的本質(zhì)是,數(shù)據(jù)庫(kù)多事務(wù)并發(fā)問(wèn)題,為了解決這些問(wèn)題,數(shù)據(jù)庫(kù)設(shè)計(jì)了事務(wù)隔離級(jí)別、MVCC多版本控制、鎖機(jī)制。

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

SQL標(biāo)準(zhǔn)中定義了4種事務(wù)隔離級(jí)別,就是說(shuō)事務(wù)并發(fā)運(yùn)行的時(shí)候,互相是如何隔離的,MySQL默認(rèn)是可重復(fù)讀(RR)。

 

 

 

 

不同的隔離級(jí)別是可以避免不同的事務(wù)并發(fā)問(wèn)題的。

read-uncommitted(RU),可能會(huì)發(fā)生臟讀、不可重復(fù)讀、幻讀。

read-committed(RC),不會(huì)發(fā)生臟讀,但是會(huì)發(fā)生不可重復(fù)讀、幻讀

也就是說(shuō),事務(wù)沒提交的情況下修改的值,你是讀不到的。但是,一旦事務(wù)提交了,你事務(wù)就能讀到,所以可能你多次讀到的值不一樣。

repeatable-read(RR),MySQL默認(rèn)的事務(wù)隔離級(jí)別,做了大量復(fù)雜的工作,解決了臟讀、不可重復(fù)讀、幻讀問(wèn)題,一般生成環(huán)境使用這個(gè)隔離級(jí)別就可以了。

serializable,事務(wù)串行執(zhí)行,根本不會(huì)并發(fā)執(zhí)行,所以不會(huì)有臟讀、不可重復(fù)讀、幻讀這些問(wèn)題。但缺點(diǎn)也非常明顯,就是并發(fā)太差了。一般生產(chǎn)環(huán)境也不會(huì)使用 

責(zé)任編輯:龐桂玉 來(lái)源: Hollis
相關(guān)推薦

2020-04-07 09:21:45

MySQL數(shù)據(jù)庫(kù)SQL

2020-02-21 20:10:13

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

2020-04-01 17:26:57

MySQL事務(wù)隔離級(jí)別數(shù)據(jù)庫(kù)

2020-10-26 09:18:50

RedisCluste

2018-12-19 16:46:38

MySQL事務(wù)隔離數(shù)據(jù)庫(kù)

2021-07-26 10:28:13

MySQL事務(wù)隔離

2024-04-26 09:17:20

MySQL事務(wù)隔離

2021-08-04 13:19:42

MySQL 事務(wù)隔離

2021-10-25 15:25:38

MySQL索引數(shù)據(jù)庫(kù)

2021-11-18 15:08:19

MySQLSQL索引

2024-12-02 08:37:04

2021-10-29 11:30:31

補(bǔ)碼二進(jìn)制反碼

2024-01-12 07:14:52

AI應(yīng)用架構(gòu)

2022-06-29 11:01:05

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

2010-11-19 16:13:06

oracle事務(wù)隔離級(jí)

2009-06-29 17:54:47

Spring事務(wù)隔離

2019-10-15 10:23:13

服務(wù)器MySQL 數(shù)據(jù)

2023-02-02 07:06:10

2022-06-10 11:51:49

MySQL事務(wù)隔離

2020-10-13 10:32:24

MySQL事務(wù)MVCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)