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

mysql事務隔離級別詳解

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

0. 事務的概念

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

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

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

1. 三類問題

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

2. 事務隔離級別

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

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

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

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

3. 操作指令

查看當前的隔離級別

SELECT @@tx_isolation;

設置隔離級別

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

4. 總結(jié)

對前期的事務隔離級別做一個表格梳理

img
mysql事務隔離級別詳解

5. 參考博文

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

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

相關(guān)文章

最新評論