国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL中的鎖機(jī)制

這篇具有很好參考價(jià)值的文章主要介紹了MySQL中的鎖機(jī)制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

拋磚引玉:多個(gè)查詢需要在同一時(shí)刻進(jìn)行數(shù)據(jù)的修改,就會(huì)產(chǎn)生并發(fā)控制的問題。我們需要如何避免寫個(gè)問題從而保證我們的數(shù)據(jù)庫數(shù)據(jù)不會(huì)被破壞。

鎖的概念

讀鎖是共享的互相不阻塞的。多個(gè)事務(wù)在聽一時(shí)刻可以同時(shí)讀取同一資源,而相互不干擾。

寫鎖的排他的。一個(gè)寫鎖會(huì)阻塞其他寫鎖或讀鎖。出于安全考慮只有這樣才能保證在給定的時(shí)間里只有一個(gè)事務(wù)能夠執(zhí)行寫入,并防止其他事務(wù)讀取正寫入的同一資源。

鎖帶來的問題

通過鎖定機(jī)制可以實(shí)現(xiàn)事務(wù)的隔離性要求,使得事務(wù)可以并發(fā)的工作,同時(shí)也帶來了三個(gè)問題:臟讀,不可重復(fù)讀和丟失更新。

臟讀

臟數(shù)據(jù):未提交的數(shù)據(jù)

如果讀到了臟數(shù)據(jù)即一個(gè)事務(wù)可以讀取到另一個(gè)事務(wù)中未提交的數(shù)據(jù)那就違背了事務(wù)的隔離性。

所以臟讀是指在不同的事務(wù)下,當(dāng)前事務(wù)可以讀取到另外事務(wù)的未提交的數(shù)據(jù),簡(jiǎn)單來說就是可以讀取到臟數(shù)據(jù)。

演示:

初始狀態(tài):

將會(huì)話A,B設(shè)置隔離級(jí)別為RU

set session transaction isolation level READ UNCOMMITTED;

會(huì)話A插入一條數(shù)據(jù)

這時(shí)候事務(wù)B在此執(zhí)行查詢操作,會(huì)發(fā)現(xiàn)事務(wù)B讀取到了事務(wù)A新增的數(shù)據(jù)。注意:此時(shí)事務(wù)A沒有提交。

不可重復(fù)讀

在一個(gè)事務(wù)中兩次讀取到的數(shù)據(jù)是不一樣的,這中情況被稱為不可重復(fù)讀。

與臟讀的區(qū)別:臟讀是讀取到了未提交的數(shù)據(jù),而不可重復(fù)讀是讀取到的卻是已經(jīng)提交的數(shù)據(jù),但是違反了數(shù)據(jù)庫事務(wù)一致性的要求。

演示:

事務(wù)B插入一條數(shù)據(jù)并且提交

事務(wù)A在此執(zhí)行select語句,事務(wù)A讀取到了事務(wù)B提交的數(shù)據(jù)

一般來說不可重復(fù)讀問題是可以接受的,因?yàn)樽x取到的是已經(jīng)提交的數(shù)據(jù),本身不會(huì)帶來什么問題。例如Oracle 和 SQL Server的默認(rèn)的事務(wù)隔離級(jí)別就是RC。 MySQL默認(rèn)的事務(wù)隔離級(jí)別是RR。

在MySQL InnoDB中通過使用 Next-key lock 算法來避免不可重復(fù)讀問題,并且將不可重復(fù)讀問題定義為幻讀(Phantom problem)

丟失更新

一個(gè)數(shù)據(jù)的更新會(huì)被另一個(gè)事務(wù)的更新操作所覆蓋,從而導(dǎo)致數(shù)據(jù)的不一致性。

第一種丟失:

A事務(wù)撤銷時(shí),把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。這種錯(cuò)誤可能造成很嚴(yán)重的問題,通過下面的賬戶取款轉(zhuǎn)賬就可以看出來:

時(shí)間 取款事務(wù)A 轉(zhuǎn)賬事務(wù)B
T1 開始事務(wù)
T2 開始事務(wù)
T3 查詢賬戶余額為1000元
T4 查詢賬戶余額為1000元
T5 匯入100元把余額改為1100元
T6 提交事務(wù)
T7 取出100元把余額改為900元
T8 撤銷事務(wù)
T9 余額恢復(fù)為1000 元(丟失更新)

第二類丟失更新

A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做操作丟失:

時(shí)間 轉(zhuǎn)賬事務(wù)A 取款事務(wù)B
T1 開始事務(wù)
T2 開始事務(wù)
T3 查詢賬戶余額為1000元
T4 查詢賬戶余額為1000元
T5 取出100元把余額改為900元
T6 提交事務(wù)
T7 匯入100元
T8 提交事務(wù)
T9 把余額改為1100 元(丟失更新)

要避免丟失更新的發(fā)生,需要讓事務(wù)在這種情況的操作變成串行化,而不是并行操作。即上面的select操作中加上排他鎖。

MySQL鎖的分類:

按照鎖的粒度來說

MySQL主要包含三種類型(級(jí)別)的鎖定機(jī)制:

全局鎖:鎖的是整個(gè)database。

表級(jí)鎖:鎖的是某個(gè)table。 (表排他鎖,表共享鎖,元數(shù)據(jù)鎖,自增鎖)

行級(jí)鎖:鎖的是某行數(shù)據(jù),也可能鎖定行之間的間隙。由某些存儲(chǔ)引擎實(shí)現(xiàn),比如InnoDB。

InnoDB的行級(jí)鎖,按照鎖定范圍來說

分為四種:

1.記錄鎖(Record Locks):鎖定索引中一條記錄。

2.間隙鎖(Gap Locks):要么鎖住索引記錄中間的值,要么鎖住第一個(gè)索引記錄前面的值或者最后一個(gè)索

引記錄后面的值。

3.臨鍵鎖(Next-Key Locks):是索引記錄上的記錄鎖和在索引記錄之前的間隙鎖的組合(間隙鎖+記錄

鎖)。

4.插入意向鎖(Insert Intention Locks):做insert操作時(shí)添加的對(duì)記錄id的鎖。

InnoDB的行級(jí)鎖,按照功能來說

分為兩種:

1.共享鎖(S):允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。

2.排他鎖(X):允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫鎖。

InnoDB行鎖是通過給索引上的索引項(xiàng)加鎖來實(shí)現(xiàn)的,因此InnoDB這種行鎖實(shí)現(xiàn)特點(diǎn)意味著:只有通過

索引條件檢索的數(shù)據(jù),InnoDB才使用行級(jí)鎖,否則,InnoDB將使用表鎖!

注意:插入意向鎖

(1)插入意向鎖是一種Gap鎖,不是意向鎖,在insert操作時(shí)產(chǎn)生。

(2)在多事務(wù)同時(shí)寫入不同數(shù)據(jù)至同一索引間隙的時(shí)候,并不需要等待其他事務(wù)完成,不會(huì)發(fā)生鎖等 待。

(3)假設(shè)有一個(gè)記錄索引包含鍵值4和7,不同的事務(wù)分別插入5和6,每個(gè)事務(wù)都會(huì)產(chǎn)生一個(gè)加在4-7之 間的插入意向鎖,獲取在插入行上的排它鎖,但是不會(huì)被互相鎖住,因?yàn)閿?shù)據(jù)行并不沖突。

(4)插入意向鎖不會(huì)阻止任何鎖,對(duì)于插入的記錄會(huì)持有一個(gè)記錄鎖。文章來源地址http://www.zghlxwxcb.cn/news/detail-645987.html

到了這里,關(guān)于MySQL中的鎖機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL中的鎖(表鎖、行鎖)

    鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或純線程并發(fā)訪問某一資源的機(jī)制。在數(shù)據(jù)庫中,除傳統(tǒng)的計(jì)算資源(CPU、RAM、I/O)的爭(zhēng)用以外,數(shù)據(jù)也是一種供許多用戶共享的資源。如何保證數(shù)據(jù)并發(fā)訪問的一致性、有效性是所在有數(shù)據(jù)庫必須解決的一個(gè)問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性

    2024年02月09日
    瀏覽(23)
  • Mysql中的鎖(理論篇)

    Mysql中的鎖(理論篇)

    為什么在可重復(fù)讀級(jí)別下,幻讀沒有產(chǎn)生? 回想一下在事務(wù)隔離級(jí)別那篇文章中,可串行化是通過什么保證的? 對(duì)操作的每一行記錄加讀鎖、寫鎖和范圍鎖;任何其他事務(wù)都必須等待持有鎖的事務(wù)釋放鎖之后才能進(jìn)行操作; 而可重復(fù)讀級(jí)別相比之下唯一少的就是范圍鎖,所

    2024年02月11日
    瀏覽(19)
  • Mysql中的鎖(case篇)

    Mysql中的鎖(case篇)

    上篇文檔中提到過 WRITE locks normally have higher priority than READ locks to ensure that updates are processed as soon as possible. This means that if one session obtains a READ lock and then another session requests a WRITE lock, subsequent READ lock requests wait until the session that requested the WRITE lock has obtained the lock and released it

    2024年02月11日
    瀏覽(15)
  • MYSQL中的鎖(面試難點(diǎn)重點(diǎn))

    MYSQL中的鎖(面試難點(diǎn)重點(diǎn))

    首先說一下?這個(gè)加鎖是個(gè)啥子過程呢 我們拿一條記錄舉例,這個(gè)記錄就放在這,沒人操作它,他就沒生成鎖結(jié)構(gòu),?直到有個(gè)事務(wù)操作它了,然后給它才生成了個(gè)鎖結(jié)構(gòu),鎖結(jié)構(gòu)兩個(gè)參數(shù)?trx(生成該鎖的事務(wù))?is_waiting(正在等待就是:true?沒在等待就是?false) (鎖里面很多參數(shù)?這里這

    2024年02月16日
    瀏覽(21)
  • 詳解數(shù)據(jù)庫的鎖機(jī)制及原理

    詳解數(shù)據(jù)庫的鎖機(jī)制及原理

    本圖源自CSDN博主:Stephen.W 數(shù)據(jù)庫鎖一般可以分為兩類, 一個(gè)是悲觀鎖,一個(gè)是樂觀鎖 樂觀鎖一般是指用戶自己實(shí)現(xiàn)的一種鎖機(jī)制,假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會(huì)造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候,才會(huì)正式對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測(cè),如果發(fā)現(xiàn)沖突了,則讓返回用

    2024年02月05日
    瀏覽(24)
  • epoll準(zhǔn)備就緒列表保護(hù)機(jī)制,引發(fā)的鎖問題討論

    epoll 就緒隊(duì)列應(yīng)該使用什么數(shù)據(jù)結(jié)構(gòu)?為什么? 在 Nginx 中,就緒隊(duì)列通常使用鏈表來實(shí)現(xiàn)。具體來說,就緒隊(duì)列是一個(gè)雙向鏈表,其中每個(gè)節(jié)點(diǎn)都包含了一個(gè) ngx_event_t 結(jié)構(gòu)體,用于表示一個(gè)已經(jīng)準(zhǔn)備就緒的事件。當(dāng) epoll 檢測(cè)到某個(gè)文件描述符上有 I/O 事件發(fā)生時(shí),就會(huì)將相應(yīng)

    2023年04月13日
    瀏覽(20)
  • InnoDB鎖初探(一):鎖分類和RR不同場(chǎng)景下的鎖機(jī)制

    InnoDB鎖初探(一):鎖分類和RR不同場(chǎng)景下的鎖機(jī)制

    數(shù)據(jù)庫鎖是Mysql實(shí)現(xiàn)數(shù)據(jù)一致性的基礎(chǔ)之一,是在事務(wù)的基礎(chǔ)之上,基于Mysql Server層或存儲(chǔ)引擎層實(shí)現(xiàn)的。 前置條件: 查看語句: 按照鎖的粒度,可以分為表鎖和行鎖 共享鎖 排他鎖 意向鎖是表級(jí)的 同樣具有意向共享鎖(IS)、意向排他鎖(IX) TABLE LOCK table *** trx id *** lo

    2024年02月09日
    瀏覽(15)
  • 數(shù)據(jù)庫中的鎖

    提及事務(wù)之間的相互影響時(shí),介紹了臟讀、幻讀等幾種類型的數(shù)據(jù)錯(cuò)誤,為更好避免發(fā)生這些錯(cuò)誤,引入了對(duì)資源的鎖定。鎖定的存在使得一個(gè)事務(wù)對(duì)他自己的數(shù)據(jù)塊進(jìn)行操作時(shí),另外一個(gè)事務(wù)不能插足這個(gè)數(shù)據(jù)塊。 鎖的分類 從數(shù)據(jù)庫系統(tǒng)的角度,鎖模式可分為以下6 種類型

    2024年02月13日
    瀏覽(17)
  • Go 語言中的鎖

    并發(fā)是同時(shí)發(fā)生多個(gè)計(jì)算或事件的能力。并發(fā)通常通過同時(shí)執(zhí)行多個(gè)任務(wù)或進(jìn)程來實(shí)現(xiàn),這些任務(wù)或進(jìn)程共享相同的資源(例如內(nèi)存或處理器)。并發(fā)使用的基本機(jī)制被稱為鎖。在Go語言中,鎖是一個(gè)類型變量,它包含一個(gè)內(nèi)部計(jì)數(shù)器,用于跟蹤已獲取的鎖的數(shù)量。當(dāng)一個(gè)g

    2024年01月16日
    瀏覽(13)
  • 編程(39)----------多線程中的鎖

    編程(39)----------多線程中的鎖

    假設(shè)一個(gè)這樣的場(chǎng)景: 在多線程的代碼中, 需要在不同的線程中對(duì)同一個(gè)變量進(jìn)行操作. 那此時(shí)就會(huì)出現(xiàn)問題: 多線程是并發(fā)進(jìn)行的, 也就是說代碼運(yùn)行的時(shí)候, 倆個(gè)線程會(huì)同時(shí)對(duì)一個(gè)變量進(jìn)行操作, 這樣就會(huì)涉及到多線程的安全問題: 在這個(gè)代碼中, 兩個(gè)線程會(huì)分別對(duì)count進(jìn)行自

    2024年02月07日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包