日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

mysql事务隔离级别 花_MySQL事务的隔离级别

發(fā)布時(shí)間:2025/4/5 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql事务隔离级别 花_MySQL事务的隔离级别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么要有事務(wù)?

當(dāng)需要對(duì)一個(gè)數(shù)據(jù)表進(jìn)行一系列多個(gè)操作的情況下,為了防止這些操作中一部分操作成功,而另一部分操作失敗,從而導(dǎo)致數(shù)據(jù)不正確,我們就需要事務(wù)來(lái)控制了。

當(dāng)兩個(gè)人或者多個(gè)人同時(shí)操作同一條數(shù)據(jù)的時(shí)候,會(huì)有數(shù)據(jù)的不統(tǒng)一或者造成幻覺(jué)現(xiàn)象,我們就需要事務(wù)來(lái)控制了。

什么是事務(wù)

事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。

假如張三給李四轉(zhuǎn)賬100塊,這就等價(jià)于張三余額減少100,李四的余額增加100.假如系統(tǒng)在張三減少100元之后崩潰了,導(dǎo)致張三余額減少而李四沒(méi)有增加,那很明顯就出問(wèn)題了。

所以這里就需要 「 事務(wù)控制 」 。事務(wù)就是保證你這一系列操作要么都成功,要么都失敗。

事務(wù)的特性(ACID)

原子性: 事務(wù)是最小的單位,不允許分割。事務(wù)的原子性確保動(dòng)作要么全部完成,要么全部失敗。

一致性: 執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致。例如轉(zhuǎn)賬業(yè)務(wù)中,無(wú)論事務(wù)成功與否,轉(zhuǎn)賬人和收款人的總金額是不變的。

隔離性: 并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),一個(gè)用戶的事務(wù)不被其它事務(wù)所干擾。各并發(fā)事務(wù)之間數(shù)據(jù)庫(kù)是獨(dú)立的。

持久性: 一個(gè)事務(wù)被提交之后,它對(duì)數(shù)據(jù)庫(kù)的改變是持久的,即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。

并發(fā)事務(wù)帶來(lái)的問(wèn)題

數(shù)據(jù)庫(kù)并發(fā)經(jīng)常會(huì)出現(xiàn)以下幾個(gè)問(wèn)題,也是數(shù)據(jù)庫(kù)事務(wù)面試經(jīng)常會(huì)問(wèn)到的重點(diǎn):

臟讀(Dirty Read): 指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。

事務(wù)T1將某一值修改,然后事務(wù)T2讀取該值,此后T1因?yàn)槟撤N原因撤銷對(duì)該值的修改,這就導(dǎo)致了T2所讀取到的數(shù)據(jù)是無(wú)效的。

不可重復(fù)讀(Unrepeatable Read): 在一個(gè)事務(wù)內(nèi),多次讀同一個(gè)數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)并修改數(shù)據(jù)。那么,在第一個(gè)事務(wù)的兩次讀數(shù)據(jù)之間。由于另一個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能不一樣,這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為不可重復(fù)讀,即原始讀取不可重復(fù)。

事務(wù)T1讀取某一數(shù)據(jù),事務(wù)T2讀取并修改了該數(shù)據(jù),T1為了對(duì)讀取值進(jìn)行檢驗(yàn)而再次讀取該數(shù)據(jù),便得到了不同的結(jié)果

幻讀(Phantom read): 當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,比如這種修改涉及到表中的“全部數(shù)據(jù)行”。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入“一行新數(shù)據(jù)”。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還存在沒(méi)有修改的數(shù)據(jù)行,就好像發(fā)生了幻覺(jué)一樣。

事務(wù)A讀取與搜索條件相匹配的若干行。事務(wù)B以插入或刪除行等方式來(lái)修改事務(wù)A的結(jié)果集,然后再提交。

不可重復(fù)讀和幻讀

不可重復(fù)讀的重點(diǎn)是修改,幻讀的重點(diǎn)在于新增或刪除。

例子 (同樣的查詢條件,你讀取過(guò)一次,再次讀取出來(lái)看到數(shù)據(jù)不一致) : 事務(wù)a中張三查看自己的工資是3000元,還未提交事務(wù),事務(wù)b中老板給張三發(fā)了3000元工資,導(dǎo)致張三還未提交,查詢第二次的時(shí)候發(fā)現(xiàn)工資變成了6000;這就是不可重復(fù)讀。

例子 (同樣的條件,讀取出來(lái)的數(shù)據(jù)數(shù)量不一致): 假設(shè)有個(gè)商品庫(kù),事務(wù)a讀取了所有的可口可樂(lè)牌的飲料,統(tǒng)一修改價(jià)格為5元,這時(shí)候事務(wù)b新增了一條可口可樂(lè)牌的飲料,價(jià)格為2.5元。事務(wù)a再次讀取時(shí)查看記錄多了一條2.5元的可口可樂(lè)飲料(剛剛明明把所有可口可樂(lè)相關(guān)的都改成了5元的),這樣就導(dǎo)致了幻讀。

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

SQL標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別:

讀未提交: 最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,

「 該級(jí)別可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀 」 。

讀已提交: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),

「 可以阻止臟讀,但是幻讀和不可重復(fù)讀仍會(huì)發(fā)生 」 。

可重復(fù)讀: 對(duì)同一字段的多次讀取結(jié)果是一致的,除非數(shù)據(jù)是本身事務(wù)自己所修改,

「 可以阻止臟讀和不可重復(fù)讀,但是幻讀仍有可能發(fā)生 」 。

可串行化: 最高隔離級(jí)別,完全服從ACID的隔離級(jí)別。所有事務(wù)依次執(zhí)行,這樣事務(wù)之間相互不可能存在干擾,即

「 防止了臟讀、不可重復(fù)讀和幻讀 」 。

隔離級(jí)別

臟讀

不可重復(fù)讀

幻讀

讀未提交

true

true

true

讀已提交

false

true

true

可重復(fù)讀

false

false

true

可串行化

false

false

false

MySQL InnoDB存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重復(fù)讀) 。可以通過(guò) SELECT @@tx_isolation;命令查看。(MySQL:5.7)

mysql> SELECT @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+

這里需要注意的是:與 SQL 標(biāo)準(zhǔn)不同的地方在于InnoDB 存儲(chǔ)引擎在 ?REPEATABLE-READ(可重讀) 事務(wù)隔離級(jí)別下使用的是 Next-Key Lock ?鎖算法,因此可以避免幻讀的產(chǎn)生,這與其他數(shù)據(jù)庫(kù)系統(tǒng)(如 SQL Server)是不同的。所以說(shuō)InnoDB 存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重讀) 已經(jīng)可以完全保證事務(wù)的隔離性要求,即達(dá)到了 SQL標(biāo)準(zhǔn)的 SERIALIZABLE(可串行化) 隔離級(jí)別。

因?yàn)楦綦x級(jí)別越低,事務(wù)請(qǐng)求的鎖越少,所以大部分?jǐn)?shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別都是 READ-COMMITTED(讀已提交) 。但是你要知道的是InnoDB存儲(chǔ)引擎默認(rèn)使用 REPEATABLE-READ(可重讀) 并不會(huì)有任何性能損失。

InnoDB 存儲(chǔ)引擎在 分布式事務(wù) 的情況下一般會(huì)用到 SERIALIZABLE(可串行化) 隔離級(jí)別。

都結(jié)合網(wǎng)上資料加上自己的一些理解,如果有影響到他人的地方,可以聯(lián)系我:fzfz2007@163.com

總結(jié)

以上是生活随笔為你收集整理的mysql事务隔离级别 花_MySQL事务的隔离级别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。