日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库并发控制

發(fā)布時(shí)間:2023/12/10 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库并发控制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ACID,是指在可靠數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,事務(wù)(transaction)所應(yīng)該具有的四個(gè)特性:

A:原子性(Atomicity):事務(wù)是一個(gè)或多個(gè)行為捆綁在一起組成一個(gè)單獨(dú)的工作單元,事務(wù)中的動(dòng)作要不都發(fā)生,要不都不發(fā)生.

C:一致性(Consistent):即在事務(wù)開始之前和結(jié)束之后,數(shù)據(jù)庫的完整性約束沒有被破壞.

  數(shù)據(jù)庫層面:在一個(gè)事務(wù)執(zhí)行前和執(zhí)行后,數(shù)據(jù)會(huì)符合你設(shè)置的約束(例如unique約束,foreign key約束,check約束等)和觸發(fā)器設(shè)置.由數(shù)據(jù)庫進(jìn)行保證.

  業(yè)務(wù)層面:保持業(yè)務(wù)的一致性.需要由開發(fā)人員進(jìn)行保證.

I:隔離性(Isolation):指的是在并發(fā)環(huán)境中,事務(wù)之間互相影響的程度(即并發(fā)事務(wù)間數(shù)據(jù)的可見程度).當(dāng)不同的事務(wù)同時(shí)操縱相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自的完整數(shù)據(jù)空間.由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離.事務(wù)查看數(shù)據(jù)更新時(shí),數(shù)據(jù)所處的狀態(tài)要么是另一事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看到中間狀態(tài)的數(shù)據(jù).?

D:持久性(Durability):一旦事務(wù)完成,事務(wù)的結(jié)果應(yīng)該持久化,用來保證即使系統(tǒng)崩潰也不會(huì)破壞事務(wù)的結(jié)果.

?

?

?

?

我們通過可視化界面對(duì)不同的數(shù)據(jù)庫進(jìn)行管理,不可避免要實(shí)現(xiàn)多個(gè)進(jìn)程訪問數(shù)據(jù)庫同一數(shù)據(jù),或者修改同一數(shù)據(jù)。不得不提到數(shù)據(jù)庫利用加鎖和阻塞來保證事物之間不同等級(jí)的隔離性,從而實(shí)現(xiàn)事務(wù)的互不干擾的訪問和操作數(shù)據(jù)庫.

干擾數(shù)據(jù)的隔離性的四大問題:

No.1 丟失修改(丟失更新 ps:反正叫什么的都有)

如果兩個(gè)事務(wù)都要更新數(shù)據(jù)庫一個(gè)字段X,X=100;

事務(wù)A事務(wù)B
讀取X=100?讀取X=100
寫入x=X+100寫入x=X+200
事務(wù)結(jié)束x=200?事務(wù)結(jié)束x=300
?最后x=300

兩個(gè)不同的事務(wù)同時(shí)獲得了相同的數(shù)據(jù),又都對(duì)這個(gè)數(shù)據(jù)進(jìn)行了修改,那么先提交的事務(wù)的更新就會(huì)被后提交事務(wù)的更新覆蓋掉.叫做丟失更新.

No.2 臟讀(讀臟數(shù)據(jù) 未提交讀)

事務(wù)A???事務(wù)B
?寫入x=X+100 (x=200)
讀取X=200 (讀取了事務(wù)B未提交的數(shù)據(jù))???
?事務(wù)回滾x=100?
?事務(wù)結(jié)束x=100
事務(wù)結(jié)束

事務(wù)讀取了未提交的數(shù)據(jù),如圖 事務(wù)B可能出現(xiàn)未提交或者提交不成功的情況而進(jìn)行回滾,這就導(dǎo)致事務(wù)A讀取了錯(cuò)誤的數(shù)據(jù),也叫臟數(shù)據(jù).

No.3 不可重復(fù)讀

一個(gè)事務(wù)執(zhí)行期間,在自己沒有更新數(shù)據(jù)庫的情況下,同一個(gè)查詢操作在執(zhí)行一次或多次的情況下,結(jié)果應(yīng)該是一致的.

?

事務(wù)A事務(wù)B
讀取X=100讀取X=100
讀取X=100?寫入x=X+100
?事務(wù)結(jié)束, x=200
讀取X=200
(此時(shí),在同一個(gè)事務(wù)A中,讀取的X值發(fā)生了變化!)
?
事務(wù)結(jié)束?

這種情況事務(wù)A多次讀取數(shù)據(jù)出現(xiàn)不一致的結(jié)果.

摘自薩師煊老師的數(shù)據(jù)庫系統(tǒng)概論的解釋:不可重復(fù)讀包括三種情況(這里列舉第一種情況 因?yàn)楹髢煞N情況也稱為幻影現(xiàn)象):

(1):事務(wù)T1讀取某一數(shù)據(jù)之后,事務(wù)T2對(duì)其進(jìn)行了修改,當(dāng)事務(wù)T1再次讀該數(shù)據(jù)時(shí),得到與前一次不同的值.如上所示

No.4 幻讀(幻影現(xiàn)象)

這個(gè)問題可有意思了,很多博主說他跟不可重復(fù)讀有相似的地方,我認(rèn)為這樣更容易讓讀者混淆.數(shù)據(jù)庫書中說的幻影現(xiàn)象就是不可重復(fù)讀情況中的兩種.

(2):事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后,事務(wù)T2刪除了其中部分記錄,當(dāng)T1再次按照相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)某些記錄神秘的消失了.

(3):事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后,事務(wù)T2插入了一些記錄,當(dāng)T1再次按照相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)多了一些記錄.

知乎大佬的例子:

users: id 主鍵

1、T1:select * from users where id = 1;

2、T2:insert into `users`(`id`, `name`) values (1, 'big cat');

3、T1:insert into `users`(`id`, `name`) values (1, 'big cat');

?

T1 :主事務(wù),檢測(cè)表中是否有 id 為 1 的記錄,沒有則插入,這是我們期望的正常業(yè)務(wù)邏輯。

T2 :干擾事務(wù),目的在于擾亂 T1 的正常的事務(wù)執(zhí)行。

在 RR(這里摘自知乎某位大佬的回答 我也不曉得RR是什么東東) 隔離級(jí)別下,1、2 是會(huì)正常執(zhí)行的,3 則會(huì)報(bào)錯(cuò)主鍵沖突,對(duì)于 T1 的業(yè)務(wù)來說是執(zhí)行失敗的,這里 T1 就是發(fā)生了幻讀,因?yàn)門1讀取的數(shù)據(jù)狀態(tài)并不能支持他的下一步的業(yè)務(wù),見鬼了一樣。

所以 mysql 的幻讀并非什么讀取兩次返回結(jié)果集不同,而是事務(wù)在插入事先檢測(cè)不存在的記錄時(shí),驚奇的發(fā)現(xiàn)這些數(shù)據(jù)已經(jīng)存在了,之前的檢測(cè)讀獲取到的數(shù)據(jù)如同鬼影一般

這里要靈活的理解讀取的意思,第一次select是讀取,第二次的 insert 其實(shí)也屬于隱式的讀取,只不過是在 mysql 的機(jī)制中讀取的,插入數(shù)據(jù)也是要先讀取一下有沒有主鍵沖突才能決定是否執(zhí)行插入。

不可重復(fù)讀側(cè)重表達(dá) 讀-讀,幻讀則是說 讀-寫,用寫來證實(shí)讀的是鬼影。

作者:知乎用戶
鏈接:https://www.zhihu.com/question/47007926/answer/222348887
來源:知乎
大佬的最后一句話:不可重復(fù)的側(cè)重表達(dá)讀-讀,幻讀則是說讀-寫.? emmmm.... 在講隔離級(jí)別之前復(fù)習(xí)一下封鎖的知識(shí). 封鎖是實(shí)現(xiàn)并發(fā)控制的一個(gè)非常重要的技術(shù).基本的封鎖類型有兩種:排他鎖(X鎖)共享鎖(S鎖); 排它鎖又稱寫鎖,若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖,則只允許T讀取和修改A,其他任何事務(wù)都不能再對(duì)A加任何類型的鎖直到T釋放A上的鎖為止. 共享鎖又稱讀鎖,若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上S鎖,則事務(wù)T可以讀A但不能修改A,其他事物只能再對(duì)A加S鎖,而不能加X鎖. 在運(yùn)用 排他鎖 和 共享鎖 對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則,例如何時(shí)申請(qǐng) 排他鎖 或 共享鎖、持鎖時(shí)間、何時(shí)釋放等。稱這些規(guī)則為封鎖協(xié)議(Locking Protocol)。對(duì)封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。不同的封鎖協(xié)議對(duì)應(yīng)不同的隔離級(jí)別

在標(biāo)準(zhǔn)SQL規(guī)范中,定義了4個(gè)事務(wù)隔離級(jí)別,不同的隔離級(jí)別對(duì)事務(wù)的處理不同:

A.  未授權(quán)讀取(Read uncommited):允許臟讀取,但不允許丟失修改。

對(duì)應(yīng)一級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對(duì)其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。?

B.  授權(quán)讀取(Read Committed):允許不可重復(fù)讀取,但不允許臟讀取和丟失修改。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

對(duì)應(yīng)二級(jí)封鎖協(xié)議:二級(jí)封鎖協(xié)議是:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后即可釋放S鎖(瞬間S鎖)。

C.  可重復(fù)讀取(Repeatable Read):禁止不可重復(fù)讀取和臟讀取和丟失修改,但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù)。這可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

對(duì)應(yīng)三級(jí)封鎖協(xié)議:三級(jí)封鎖協(xié)議是:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放

D.  序列化(Serializable):提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。

?四級(jí)封鎖協(xié)議是對(duì)三級(jí)封鎖協(xié)議的增強(qiáng),其實(shí)現(xiàn)機(jī)制也最為簡單,直接對(duì)事務(wù)中所讀取或者更改的數(shù)據(jù)所在的表加表鎖,也就是說,其他事務(wù)不能讀寫該表中的任何數(shù)據(jù)。這樣所有的臟讀,不可重復(fù)讀,幻讀,都得以避免!

?

我真是日了 好多博客連一級(jí)封鎖協(xié)議都不一樣哈 有加排他鎖的,有加共享鎖的. 我就是按照書上的加排他鎖吧.

并發(fā)控制有四個(gè)問題,也有五個(gè)問題的......

我就按照我的這想法吧 畢竟說法那么多 P313附近有這個(gè)知識(shí)點(diǎn).有疑問就去查?

?

轉(zhuǎn)載于:https://www.cnblogs.com/yyhao/p/7804786.html

總結(jié)

以上是生活随笔為你收集整理的数据库并发控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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