主頁(yè) > 知識(shí)庫(kù) > 關(guān)于msyql事務(wù)隔離你要知道

關(guān)于msyql事務(wù)隔離你要知道

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 AI電銷 鐵路電話系統(tǒng) 服務(wù)外包 百度競(jìng)價(jià)排名 Linux服務(wù)器

什么是事務(wù)?

事務(wù)是數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行過程中的一個(gè)邏輯單位,由一個(gè)有限的數(shù)據(jù)庫(kù)操作序列構(gòu)成。數(shù)據(jù)庫(kù)事務(wù)通常包含了一個(gè)序列的對(duì)數(shù)據(jù)庫(kù)的讀/寫操作。包含有以下兩個(gè)目的:

  1. 為數(shù)據(jù)庫(kù)操作序列提供了一個(gè)從失敗中恢復(fù)到正常狀態(tài)的方法,同時(shí)提供了數(shù)據(jù)庫(kù)即使在異常狀態(tài)下仍能保持一致性的方法。
  2. 當(dāng)多個(gè)應(yīng)用程序在并發(fā)訪問數(shù)據(jù)庫(kù)時(shí),可以在這些應(yīng)用程序之間提供一個(gè)隔離方法,以防止彼此的操作互相干擾。

隔離性與隔離級(jí)別

提到事務(wù),你肯定會(huì)想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性),今 天我們就來說說其中I,也就是“隔離性”。當(dāng)數(shù)據(jù)庫(kù)上有多個(gè)事務(wù)同時(shí)執(zhí)行的時(shí)候,就可能出現(xiàn)臟讀(dirty read)、不可重復(fù)讀(non-repeatable read)、幻讀 (phantom read)的問題,為了解決這些問題,就有了“隔離級(jí)別”的概念。隔離級(jí)別做的越強(qiáng)則性能就越不好,所以要在性能與隔離級(jí)別中取一個(gè)平衡點(diǎn)。SQL標(biāo)準(zhǔn)的事務(wù)隔離級(jí)別包括:

  • 讀未提交(read uncommitted):一個(gè)事務(wù)提交之后,它做的變更才會(huì)被其他事務(wù)看到。會(huì)產(chǎn)生臟讀。
  • 讀已提交(read committed):一個(gè)事務(wù)提交之后,它做的變更才會(huì)被其他事務(wù)看到。會(huì)產(chǎn)生不可重復(fù)讀。
  • 可重復(fù)讀(repeatable read) :一個(gè)事務(wù)執(zhí)行過程中看到的數(shù)據(jù),總是跟這個(gè)事務(wù)在啟動(dòng)時(shí)看到的數(shù)據(jù)是一致的。當(dāng)然在可重復(fù)讀隔離級(jí) 別下,未提交變更對(duì)其他事務(wù)也是不可⻅的。會(huì)產(chǎn)生幻讀。
  • 串行化(serializable ):顧名思義是對(duì)于同一行記錄,“寫”會(huì)加“寫鎖”,“讀”會(huì)加“讀鎖”。當(dāng)出現(xiàn)讀寫鎖沖突的時(shí)候,后訪問的事務(wù)必須等前 一個(gè)事務(wù)執(zhí)行完成,才能繼續(xù)執(zhí)行。

隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀未提交 可以出現(xiàn) 可以出現(xiàn) 可以出現(xiàn)
讀提交 不允許出現(xiàn) 可以出現(xiàn) 可以出現(xiàn)
可重復(fù)讀 不允許出現(xiàn) 不允許出現(xiàn) 可以出現(xiàn)
序列化 不允許出現(xiàn) 不允許出現(xiàn) 不允許出現(xiàn)

主要是讀已提交和可重復(fù)讀比較難區(qū)分,所以我們看個(gè)小例子。先創(chuàng)建一張表,并插入數(shù)據(jù)1

create database test;
use test;
create table test(id int primary key);
insert into test(id) values(1);

事務(wù)A 事務(wù)B
啟動(dòng)事務(wù)查詢得到1 啟動(dòng)事務(wù)
查詢得到1
將1改為2
查詢得到V1
提交事務(wù)B
查詢得到V2
提交事務(wù)A
查詢得到V3

我們來看看在不同的隔離級(jí)別下,事務(wù)A會(huì)有哪些不同的返回結(jié)果,也就是圖里面V1、V2、V3的返回值分別是什么。

  • 若隔離級(jí)別是“讀未提交”, 則V1的值就是2。這時(shí)候事務(wù)B雖然還沒有提交,但是結(jié)果已經(jīng)被A看到了。因此,V2、V3也都 是2。
  • 若隔離級(jí)別是“讀提交”,則V1是1,V2的值是2。事務(wù)B的更新在提交后才能被A看到。所以, V3的值也是2。
  • 若隔離級(jí)別是“可重復(fù)讀”,則V1、V2是1,V3是2。之所以V2還是1,遵循的就是這個(gè)要求:事務(wù)在執(zhí)行期間看到的數(shù)據(jù)前 后必須是一致的。
  • 若隔離級(jí)別是“串行化”,則在事務(wù)B執(zhí)行“將1改成2”的時(shí)候,會(huì)被鎖住。直到事務(wù)A提交后,事務(wù)B才可以繼續(xù)執(zhí)行。所以從 A的⻆度看, V1、V2值是1,V3的值是2。

數(shù)據(jù)庫(kù)里面會(huì)創(chuàng)建一個(gè)視圖,訪問的時(shí)候以視圖的邏輯結(jié)果為準(zhǔn)。在“可重復(fù)讀”隔離級(jí)別下,這個(gè)視圖是在事務(wù)啟 動(dòng)時(shí)創(chuàng)建的,整個(gè)事務(wù)存在期間都用這個(gè)視圖。在“讀提交”隔離級(jí)別下,這個(gè)視圖是在每個(gè)SQL語(yǔ)句開始執(zhí)行的時(shí)候創(chuàng)建的。 這里需要注意的是,“讀未提交”隔離級(jí)別下直接返回記錄上的最新值,沒有視圖概念;而“串行化”隔離級(jí)別下直接用加鎖的方式來避免并行訪問。

那什么時(shí)候需 要**“可重復(fù)讀”**的場(chǎng)景呢?

假設(shè)你在管理一個(gè)個(gè)人銀行賬戶表。一個(gè)表存了每個(gè)月月底的余額,一個(gè)表存了賬單明細(xì)。這時(shí)候你要做數(shù)據(jù)校對(duì),也就是判斷上個(gè)月的余額和當(dāng)前余額的差額,是否與本月的賬單明細(xì)一致。你一定希望在校對(duì)過程中,即使有用戶發(fā)生了一筆新的交 易,也不影響你的校對(duì)結(jié)果。

事務(wù)隔離的實(shí)現(xiàn)

在MySQL中,實(shí)際上每條記錄在更新的時(shí)候都會(huì)同時(shí)記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個(gè)狀態(tài)的值。假設(shè)一個(gè)值從1被按順序改成了2、3、4,在回滾日志里面就會(huì)有類似下面的記錄。

當(dāng)前值是4,但是在查詢這條記錄的時(shí)候,不同時(shí)刻啟動(dòng)的事務(wù)會(huì)有不同的read-view。如圖中看到的,在視圖A、B、C里面, 這一個(gè)記錄的值分別是1、2、4,同一條記錄在系統(tǒng)中可以存在多個(gè)版本,就是數(shù)據(jù)庫(kù)的多版本并發(fā)控制(MVCC)。對(duì)于 read-view A,要得到1,就必須將當(dāng)前值依次執(zhí)行圖中所有的回滾操作得到。即使現(xiàn)在有另外一個(gè)事務(wù)正在將4改成5,這個(gè)事務(wù)跟read-view A、B、C對(duì)應(yīng)的事務(wù)是不會(huì)沖突的。

回滾日志總不能一直保留吧,什么時(shí)候刪除呢?

在不需要的時(shí)候才刪除。也就是說,系統(tǒng)會(huì)判斷,當(dāng)沒有事務(wù)再需要用到這些回滾日志時(shí),回滾日志會(huì)被刪除。

什么時(shí)候才不需要了呢?

就是當(dāng)系統(tǒng)里沒有比這個(gè)回滾日志更早的read-view的時(shí)候。

為什么盡量不要使用事務(wù)?

事務(wù)意味著系統(tǒng)里面會(huì)存在很老的事務(wù)視圖,在這個(gè)事務(wù)提交之前,回滾記錄都要保留, 這會(huì)導(dǎo)致大量占用存儲(chǔ)空間。除此之外,事務(wù)還占用鎖資源,可能會(huì)拖垮庫(kù)。

以上就是關(guān)于msyql事務(wù)隔離你要知道的詳細(xì)內(nèi)容,更多關(guān)于mysql事務(wù)隔離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Mysql事務(wù)隔離級(jí)別之讀提交詳解
  • 通過實(shí)例分析MySQL中的四種事務(wù)隔離級(jí)別
  • MySQL四種事務(wù)隔離級(jí)別詳解
  • MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別詳解
  • MySQL 四種事務(wù)隔離級(jí)別詳解及對(duì)比
  • 深入解析MySQL的事務(wù)隔離及其對(duì)性能產(chǎn)生的影響
  • MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程
  • MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別介紹(Transaction Isolation Level)

標(biāo)簽:湘潭 湖南 仙桃 衡水 崇左 黃山 銅川 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于msyql事務(wù)隔離你要知道》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266