久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數(shù)據(jù)庫事務(wù)隔離級別與概念是什么

133次閱讀
沒有評論

共計 2954 個字符,預(yù)計需要花費(fèi) 8 分鐘才能閱讀完成。

這篇文章將為大家詳細(xì)講解有關(guān)數(shù)據(jù)庫事務(wù)隔離級別與概念是什么,文章內(nèi)容質(zhì)量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

事務(wù)隔離的概念

任何支持事務(wù)的數(shù)據(jù)庫,都必須具備四個特性,分別是:

原子性(Atomicity)

一致性(Consistency)

隔離性(Isolation)

持久性(Durability)

以上四點(diǎn)也就是常說的事務(wù) ACID,數(shù)據(jù)庫具備以上特性才能保證事務(wù) (Transaction) 中數(shù)據(jù)的正確性。而其中事務(wù)的隔離性指:事務(wù)間是相互獨(dú)立的,不會互相影響,既一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的。

沒有事務(wù)隔離會引發(fā)什么問題?

如果沒有事務(wù)隔離那么可能會出現(xiàn)臟讀、不可重復(fù)讀、幻讀等情況。

為了幫助及加深理解,我們采用熟悉的“葫蘆娃”作為例子。最先藤上有七個葫蘆,每當(dāng)有一個葫蘆娃誕生時,老爺爺就會將他的信息錄入數(shù)據(jù)庫表中,如下:

某一天,四娃誕生了。事務(wù) A(爺爺)訪問了數(shù)據(jù)庫,目的是往數(shù)據(jù)庫里添加新誕生葫蘆娃的信息,但是還沒有提交事務(wù)。

insert into T values (4,  四娃 , 噴水

這時,來了另一個事務(wù) B(蛇精),她進(jìn)行了查詢操作,想查詢所有已誕生的葫蘆娃信息

select * from T; // 結(jié)果中出現(xiàn)了四娃的信息

這時,如果事務(wù)之間沒有有效隔離,那么 蛇精 查詢數(shù)據(jù)庫返回的結(jié)果中就會出現(xiàn) 四娃 的信息,這就是臟讀。

(1) 臟讀:指在自己的事務(wù)中讀到了別人未提交的數(shù)據(jù)

第二天,事務(wù) A(蛇精)一大早就查詢了數(shù)據(jù)庫中關(guān)于四娃的信息

select * from T where ID = 4; // 名稱:四娃   能力:噴水

這時,事務(wù) B(爺爺)來了,因為爺爺發(fā)現(xiàn)四娃其實(shí)是會噴火而不是噴水,所以更新一下將改了四娃的能力為噴火,然后提交了事務(wù)。

update T set Ability=  噴火  where ID = 4;

接著,蛇精 (事務(wù) A) 還想再查看一次用于確認(rèn)四娃的信息,于是又執(zhí)行了

select * from T where ID = 4;// 名稱:四娃   能力:噴火

這時候她驚訝地發(fā)現(xiàn)兩次讀出來四娃的信息,能力竟然不相同! 這就是不可重復(fù)讀。

(2) 不可重復(fù)讀:指在自己的事務(wù)中讀取兩次,前后的數(shù)據(jù)不一樣

第三天

事務(wù) A(蛇精)訪問了數(shù)據(jù)庫,她想要看看到底已經(jīng)誕生的葫蘆娃有哪些,于是她執(zhí)行了

select * from T; // 查出一共有四條葫蘆娃信息

這時候因為五娃誕生了,所以事務(wù) B(爺爺)打開了數(shù)據(jù)庫并將五娃的信息錄入

insert into T values (5,  五 , 噴水

這時候,事務(wù) A(蛇精)想要再查詢一次所有已誕生的葫蘆娃信息進(jìn)行確認(rèn),于是又執(zhí)行了查詢

select * from T; // 查出一共有五條葫蘆娃信息

這個時候事務(wù) A(蛇精)可能就會蒙了,以為自己產(chǎn)生了幻覺。這種情況就叫“幻讀。

(3) 幻讀:指在自己的事務(wù)中兩個連續(xù)的查找之間一個并發(fā)的修改事務(wù)修改了查詢的數(shù)據(jù)集,導(dǎo)致這兩個查詢返回了不同的結(jié)果(注:不可重復(fù)讀與幻讀很相似,不可重復(fù)讀的重點(diǎn)是修改,而幻讀的重點(diǎn)在于新增或者刪除)

數(shù)據(jù)庫的隔離級別

想要避免以上的情況,我們可以通過設(shè)置數(shù)據(jù)庫的隔離級別(結(jié)合實(shí)際場景選擇最適合的級別)。一般數(shù)據(jù)庫都包括以下四種隔離級別:

讀未提交(Read Uncommitted)

讀提交(Read Committed)

可重復(fù)讀(Repeated Read)

串行化(Serializable)

這里以 MySQL 為例,在 MySQL 中事務(wù)隔離級別分為以下四級:

0 級:TRANSACTION_READ_UNCOMMITTED 一切都可發(fā)生

1 級:TRANSACTION_READ_COMMITTED– 不可以發(fā)生臟讀,不可重復(fù)讀和幻讀可以發(fā)生

2 級:TRANSACTION_REPEATABLE_READ– 不可以發(fā)生臟讀和重復(fù)讀,可以發(fā)生幻讀

3 級:TRANSACTION_SERIALIZABLE – 都不可發(fā)生

(1) 讀未提交(TRANSACTION_READ_UNCOMMITTED)

讀未提交,指可以讀到未提交的內(nèi)容。因為這種隔離級別下查詢是不會加鎖的,所以可能會產(chǎn)生“臟讀”、“不可重復(fù)讀”、“幻讀”。在實(shí)際開發(fā)中如無特殊情況基本是不會使用該隔離級別的。

(2) 讀提交(TRANSACTION_READ_COMMITTED)

讀提交,指只能讀到已經(jīng)提交了的內(nèi)容。這是最常用的一種隔離級別也是 Oracle 和 SQLServer 的默認(rèn)級別,該級別可以有效地避免臟讀。(注意:除非顯示加鎖如共享鎖、排他鎖,否則查詢是默認(rèn)不加鎖的。而區(qū)別于“讀未提交”,“讀提交”可避免臟讀的原因是采用了  “快照讀”)

(3) 可重復(fù)讀(TRANSACTION_REPEATABLE_READ)

可重復(fù)讀,該級別可以有效的避免“不可重復(fù)讀”,也是 MySQL 數(shù)據(jù)庫 innodb 默認(rèn)的級別。在這個級別下,普通的查詢同樣是使用的“快照讀”,但是,和“讀提交”不同的是,當(dāng)事務(wù)啟動時就不允許進(jìn)行 Update 操作,而“不可重復(fù)讀”是因為兩次讀取之間進(jìn)行了數(shù)據(jù)的修改所導(dǎo)致的。因此“可重復(fù)讀”能夠有效的避免“不可重復(fù)讀”,但卻避免不了“幻讀”,因為幻讀是由于“插入或者刪除操作”而產(chǎn)生的。

(4) 串行化(TRANSACTION_SERIALIZABLE)

串行化是數(shù)據(jù)庫最高的隔離級別,這種級別下事務(wù)串行化一個一個排隊順序執(zhí)行,可避免臟讀、不可重復(fù)讀、幻讀。安全性高相應(yīng)的執(zhí)行效率低,性能開銷也最大,在實(shí)際開發(fā)中比較少用。

快照讀

數(shù)據(jù)庫讀分為:一致非鎖定讀、鎖定讀,上面提到“快照讀”也就是非鎖定讀。可簡單理解為執(zhí)行 SELECT 語句的時候會生成一個快照。

注意:不同事務(wù)隔離級別下,快照讀是存在區(qū)別的:

READ COMMITTED   隔離級別下,事務(wù)中每次讀取都會重新生成一個快照,所以每次快照都是最新的。因此事務(wù)中每次執(zhí)行 SELECT 也可以看到其它已 commit 事務(wù)所作的更改,因為讀取的是快照所以有效地避免了臟讀的情況。而假設(shè)如果沒有“快照讀(一致非鎖定讀)”使用的是“鎖定讀”,那么當(dāng)一個更新的事務(wù)沒有提交時,另一個對更新數(shù)據(jù)進(jìn)行查詢的事務(wù)會因為無法查詢而被阻塞,這種情況下并發(fā)能力及效率相對比較差。

REPEATED READ   隔離級別下,快照會在事務(wù)中第一次 SELECT 語句執(zhí)行時生成,只有在本事務(wù)中對數(shù)據(jù)進(jìn)行更改 Update 才會更新快照,因此,只有第一次 SELECT 之前其它已提交事務(wù)所作的更改可以看到。

事務(wù)的隔離性指:事務(wù)間是相互獨(dú)立的,不會互相影響,既一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的。當(dāng)沒有進(jìn)行事務(wù)隔離時可能會出現(xiàn)臟讀、幻讀、不可重復(fù)讀等情況。通過結(jié)合實(shí)際情況設(shè)置合理的隔離級別可以有效地避免以上問題。

數(shù)據(jù)庫中常見的四個隔離級別:讀未提交、讀提交、可重復(fù)讀和串行化,其中讀提交在實(shí)際開發(fā)中是比較常用的。而在其中引出了一個“讀快照”的概念,要注意的是不同隔離級別下“讀快照”是存在區(qū)別的,通過使用“讀快照”使得在發(fā)生并發(fā)操作時效率有所提升。

關(guān)于數(shù)據(jù)庫事務(wù)隔離級別與概念是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-17發(fā)表,共計2954字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 宿松县| 顺昌县| 汉寿县| 卢湾区| 海兴县| 碌曲县| 谢通门县| 监利县| 东港市| 水城县| 壶关县| 麻栗坡县| 讷河市| 深圳市| 夏河县| 图木舒克市| 巴南区| 宣威市| 平山县| 闻喜县| 孟连| 西乌珠穆沁旗| 淅川县| 龙山县| 洛宁县| 济南市| 西乌珠穆沁旗| 望谟县| 长顺县| 巫山县| 阳新县| 蕲春县| 余姚市| 休宁县| 拉萨市| 宁晋县| 中方县| 堆龙德庆县| 霍山县| 慈利县| 文山县|