欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年06月16日 08:42:27   作者:CrazyPixel  
MySQL事務(wù)隔離級(jí)別是指在多個(gè)事務(wù)同時(shí)執(zhí)行時(shí),數(shù)據(jù)庫(kù)系統(tǒng)如何處理這些事務(wù)之間的相互影響。MySQL提供了四種隔離級(jí)別:讀未提交、讀已提交、可重復(fù)讀和串行化。每種隔離級(jí)別都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況選擇合適的級(jí)別。

0. 事務(wù)的概念

事務(wù)指的是一連串的集中操作指令,一個(gè)事務(wù)的執(zhí)行必須執(zhí)行完所有的動(dòng)作才能算作執(zhí)行結(jié)束。事務(wù)具有四個(gè)特點(diǎn),簡(jiǎn)記作ACID

  • A-Atomicity: 原子性,事務(wù)的執(zhí)行必須保證所有的動(dòng)作都執(zhí)行完畢;
  • C-Consistency: 一致性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的一致性;
  • I-Isolation: 隔離性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的隔離性;
  • D-Durability: 持久性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的持久性。

而事務(wù)隔離級(jí)別則是在大型數(shù)據(jù)庫(kù)多個(gè)事務(wù)執(zhí)行的過(guò)程中,針對(duì)事務(wù)并行進(jìn)行的機(jī)制設(shè)計(jì),主要是圍繞Isolation進(jìn)行設(shè)計(jì)的。

1. 三類問(wèn)題

  • 臟讀
    • 過(guò)程:
      • 事務(wù)A正在寫某一行數(shù)據(jù),未提交;
      • 事務(wù)B并行讀取該行數(shù)據(jù),用于操作;
      • 事務(wù)A撤銷寫操作,這是對(duì)于事務(wù)B來(lái)說(shuō),之前的讀操作就是錯(cuò)誤的。
    • 讀事務(wù)讀取了寫事務(wù)未提交的數(shù)據(jù),而造成錯(cuò)誤讀取。
    • 舉例
      • 小明今天發(fā)工資,一開始在財(cái)務(wù)系統(tǒng)上查詢是工資50000元,很高興地準(zhǔn)備買新電腦,但是這是財(cái)務(wù)正在敲數(shù)據(jù)的時(shí)候一時(shí)疏忽,實(shí)際上工資只有5000元,財(cái)務(wù)在審核數(shù)據(jù)準(zhǔn)備提交的時(shí)候發(fā)現(xiàn)了這個(gè)錯(cuò)誤并修改過(guò)來(lái),小明很失望。
      • 這里的小明就是讀事務(wù),財(cái)務(wù)就是寫事務(wù)。
  • 不可重復(fù)讀
    • 過(guò)程:
      • 事務(wù)B讀取的是數(shù)據(jù)庫(kù)中的某一行數(shù)據(jù),用于操作;
      • 事務(wù)A開始對(duì)這行數(shù)據(jù)進(jìn)行寫操作并完成,數(shù)據(jù)庫(kù)的數(shù)據(jù)改變;
      • 事務(wù)B再次讀該數(shù)據(jù)庫(kù)的這一行數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)改變;
    • 讀事務(wù)兩次讀同一行數(shù)據(jù),但是兩次讀取的數(shù)據(jù)并不一致。
    • 舉例
      • 小明和小紅打賭,這個(gè)月工資是1k,兩個(gè)人幾乎同時(shí)發(fā)出查詢請(qǐng)求,但是小明先讀取到了原始數(shù)據(jù)是1k,而財(cái)務(wù)核對(duì)之后再次修改了工資為2k,小紅在這之后才并發(fā)讀取到工資是2k,兩人認(rèn)為讀操作是并行的,同時(shí)進(jìn)行,雖然知道這中間可能是財(cái)務(wù)進(jìn)行了修改,但是兩人都認(rèn)為自己讀取的才是最終數(shù)據(jù),因此吵了起來(lái)。
  • 幻讀
    • 過(guò)程
      • 事務(wù)B讀取數(shù)據(jù)庫(kù)中的一批數(shù)據(jù),用于操作;
      • 事務(wù)A添加了一行數(shù)據(jù),并完成操作,數(shù)據(jù)庫(kù)的數(shù)據(jù)改變;
      • 事務(wù)B再次讀該數(shù)據(jù)庫(kù)的數(shù)據(jù),發(fā)現(xiàn)這一批數(shù)據(jù)改變;
    • 讀事務(wù)兩次讀取同一行數(shù)據(jù),但是兩次讀取的數(shù)據(jù)不一致。(這和不可重復(fù)讀操作是一致的)。
    • 舉例
      • 小明被領(lǐng)導(dǎo)要求,改動(dòng)財(cái)務(wù)系統(tǒng)上的ID數(shù)據(jù)格式,從A格式全都轉(zhuǎn)為B格式,小明讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)之后開始修改,這時(shí)候,財(cái)務(wù)發(fā)現(xiàn)新來(lái)了一位員工叫小紅,于是把小紅的記錄添加在財(cái)務(wù)系統(tǒng)上,ID格式依然是A格式。小明工作完成之后給領(lǐng)導(dǎo)看,領(lǐng)導(dǎo)卻發(fā)現(xiàn)有一個(gè)人的數(shù)據(jù)沒(méi)有改過(guò)來(lái),很是惱火,把小明批評(píng)了一番。
    • 幻讀和不可重復(fù)讀的區(qū)別
      • 幻讀是針對(duì)同一批數(shù)據(jù),不可重復(fù)讀針對(duì)的是同一行數(shù)據(jù)

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

  • 讀未提交(read uncommitted)
  • 一個(gè)事務(wù)在寫某一行數(shù)據(jù)的時(shí)候,允許其他事務(wù)并行讀取該行數(shù)據(jù),但是不允許寫該行數(shù)據(jù);
  • 允許多個(gè)事務(wù)并行讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù),但是不允許并行寫入某一行數(shù)據(jù);
  • 可能會(huì)出現(xiàn)臟讀:
  • 解決方案:排他鎖
  • 讀已提交(read committed)

    • 一個(gè)事務(wù)在寫某一行數(shù)據(jù)的時(shí)候,不允許其他事務(wù)讀或者寫該行數(shù)據(jù);
    • 允許多個(gè)事務(wù)并行讀取數(shù)據(jù)庫(kù)的數(shù)據(jù);
    • 可能都造成不可重復(fù)讀
  • 可重復(fù)讀(repeatable read)

    • 一個(gè)事務(wù)在讀數(shù)據(jù)的時(shí)候,其他事務(wù)不允許寫,可以讀。
    • 一個(gè)事務(wù)在寫數(shù)據(jù)的時(shí)候,其他事務(wù)不可以讀或者寫。
    • 可能會(huì)造成幻讀
    • MySQL默認(rèn)的隔離級(jí)別。
  • 串行化(serializable)

    • 一個(gè)事務(wù)一個(gè)事務(wù)串行執(zhí)行,不允許任何事物并行;
    • 能夠解決幻讀、不可重復(fù)讀臟讀的問(wèn)題;
    • 成本高,一般不適用

3. 操作指令

查看當(dāng)前的隔離級(jí)別

SELECT @@tx_isolation;

設(shè)置隔離級(jí)別

 set  [glogal | session]  transaction isolation level 隔離級(jí)別名稱;//方式1
 set tx_isolation='隔離級(jí)別名稱';//方式2
``

4. 總結(jié)

對(duì)前期的事務(wù)隔離級(jí)別做一個(gè)表格梳理

img
mysql事務(wù)隔離級(jí)別詳解

5. 參考博文

MySQL事務(wù)隔離級(jí)別是保證數(shù)據(jù)一致性和并發(fā)性的重要手段。不同的隔離級(jí)別適用于不同的場(chǎng)景,需要根據(jù)實(shí)際情況進(jìn)行選擇。在使用事務(wù)時(shí),需要注意事務(wù)的提交和回滾,以及鎖的使用和釋放,以保證數(shù)據(jù)的正確性和系統(tǒng)的穩(wěn)定性。

到此這篇關(guān)于mysql事務(wù)隔離級(jí)別詳解的文章就介紹到這了,更多相關(guān)MySQL事務(wù)隔離級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論