A B 兩用戶,A 在10點(diǎn)更改X表的10到20 但一直未提交,B在10:30 要讀取X表的A更改的那條記錄的值,這時(shí)恰好B要讀取的塊在內(nèi)存里面(由于A更改需要把數(shù)據(jù)讀取到內(nèi)存)。這時(shí)候有幾種情況,假如此時(shí)ORACLE允許B讀取到A更改后但未提交的數(shù)據(jù),這時(shí)就發(fā)生了臟讀。另外就是不讓B讀取到A的更改,讀取到A更改以前的數(shù)據(jù),這時(shí)就發(fā)生了一致性讀。一致性讀會(huì)從現(xiàn)在的臟塊和undo記錄 構(gòu)造一個(gè)CR塊 構(gòu)造出來(lái)的CR塊與磁盤上的塊是一致的 我的理解是這樣的 當(dāng)然情況不只上面這一種,很多種情況 建議你看看 oracle隔離級(jí)別 相關(guān)的文章 應(yīng)該會(huì)有用
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的赤城網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù), 當(dāng)這些事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中相同的數(shù)據(jù)時(shí), 如果沒(méi)有采取必要的隔離機(jī)制, 就會(huì)導(dǎo)致各種并發(fā)問(wèn)題:
? 臟讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒(méi)有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時(shí)且無(wú)效的.
? 不可重復(fù)讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了一個(gè)字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個(gè)字段, 值就不同了.
? 幻讀: 對(duì)于兩個(gè)事物 T1, T2, T1 從一個(gè)表中讀取了一個(gè)字段, 然后 T2 在該表中插入了一些新的行. 之后, 如果 T1 再次讀取同一個(gè)表, 就會(huì)多出幾行.
數(shù)據(jù)庫(kù)事務(wù)的隔離性: 數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力, 使它們不會(huì)相互影響, 避免各種并發(fā)問(wèn)題.
一個(gè)事務(wù)與其他事務(wù)隔離的程度稱為隔離級(jí)別. 數(shù)據(jù)庫(kù)規(guī)定了多種事務(wù)隔離級(jí)別, 不同隔離級(jí)別對(duì)應(yīng)不同的干擾程度, 隔離級(jí)別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱
數(shù)據(jù)庫(kù)提供了4中隔離級(jí)別:
隔離級(jí)別 描述
READ UNCOMMITTED(讀未提交數(shù)據(jù)) 允許事務(wù)讀取未被其他事務(wù)提交的變更,臟讀、不可重復(fù)讀和幻讀的問(wèn)題都會(huì)出現(xiàn)
READ COMMITED(讀已提交數(shù)據(jù)) 只允許事務(wù)讀取已經(jīng)被其他事務(wù)提交的變更,可以避免臟讀,但不可重復(fù)讀和幻讀問(wèn)題仍然會(huì)出現(xiàn)
REPEATABLE READ(可重復(fù)讀) 確保事務(wù)可以多次從一個(gè)字段中讀取相同的值,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對(duì)這個(gè)字段進(jìn)行更新,可以避免臟讀和不可重復(fù)讀,但幻讀的問(wèn)題依然存在
SERIALIZABLE(串行化) 確保事務(wù)可以從一個(gè)表中讀取相同的行,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對(duì)該表執(zhí)行插入、更新和刪除操作,所有并發(fā)問(wèn)題都可以避免,但性能十分低
Oracle 支持的 2 種事務(wù)隔離級(jí)別:READ COMMITED, SERIALIZABLE. Oracle 默認(rèn)的事務(wù)隔離級(jí)別為: READ COMMITED
Mysql 支持 4 中事務(wù)隔離級(jí)別. Mysql 默認(rèn)的事務(wù)隔離級(jí)別為: REPEATABLE READ
1、幻想讀:事務(wù)T1讀取一條指定where條件的語(yǔ)句,返回結(jié)果集。此時(shí)事務(wù)T2插入一行新記錄,恰好滿足T1的where條件。然后T1使用相同的條件再次查詢,結(jié)果集中可以看到T2插入的記錄,這條新紀(jì)錄就是幻想
不會(huì)的。臟數(shù)據(jù)最多會(huì)導(dǎo)致數(shù)據(jù)庫(kù)越來(lái)越大,不會(huì)導(dǎo)致阻塞,基于鎖的并發(fā)系統(tǒng)才會(huì)引起阻塞、當(dāng)一個(gè)連接控制了一個(gè)鎖,而另一個(gè)連接需要沖突的鎖類型時(shí),將發(fā)生阻塞。其結(jié)果是強(qiáng)制第二個(gè)連接等待,或在第一個(gè)連接上阻塞。
數(shù)據(jù)庫(kù)事務(wù)及隔離級(jí)別
隔離級(jí)別:臟讀、幻讀、一致讀、不可重復(fù)讀、更新丟失
1.臟讀(Dirty Reads):一個(gè)事務(wù)開(kāi)始讀取了某行數(shù)據(jù)但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)很可能所有操作都被回滾
2.幻讀(Phantom Reads):也稱為幻像(幻影)。事務(wù)在操作過(guò)程中進(jìn)行兩次查詢,第二次查詢結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢SQL語(yǔ)句相同)這是因?yàn)樵趦纱尾樵冞^(guò)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的
3.不可重復(fù)讀(Non-repeatable Reads):一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次但是卻得到了不同結(jié)果。例如在兩次讀取中途有另外一個(gè)事務(wù)對(duì)該行數(shù)據(jù)進(jìn)行了修改并提交
4.兩次更新問(wèn)題(Second lost updates problem):無(wú)法重復(fù)讀取特例,有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù)然后其中一個(gè)對(duì)它進(jìn)行修改提交而另一個(gè)也進(jìn)行了修改提交這就會(huì)造成第一次寫(xiě)操作失效
5.更新丟失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù)但是第二個(gè)事務(wù)卻中途失敗退出導(dǎo)致對(duì)數(shù)據(jù)兩個(gè)修改都失效了這是系統(tǒng)沒(méi)有執(zhí)行任何鎖操作因此并發(fā)事務(wù)并沒(méi)有被隔離開(kāi)
20、鎖是什么?
鎖:在所有的DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))中,鎖是實(shí)現(xiàn)事務(wù)的關(guān)鍵,鎖可以保證事務(wù)的完整性和并發(fā)性。與現(xiàn)實(shí)生活中鎖一樣,它可以使某些數(shù)據(jù)的擁有者,在某段時(shí)間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。當(dāng)然鎖還分級(jí)別的。
鎖分為行級(jí)鎖和表鎖。
行級(jí)鎖:主要是在執(zhí)行操作過(guò)程中,鎖定指定的行。
主要的鎖行語(yǔ)句有:insert ,update,delete ,及select ....for update。
表鎖:指在運(yùn)行操作指令過(guò)程中,由用戶指定鎖定某張表。lock table XXX in mode share;
共享鎖,排他鎖,共享排它,行共享,行排他。
鎖模式包括?
共享鎖:(讀?。┎僮鲃?chuàng)建的鎖。其他用戶可以并發(fā)讀取數(shù)據(jù),但任何事物都不能獲取數(shù)據(jù)上的排它鎖,直到已釋放所有共享鎖。
排他鎖(X鎖):對(duì)數(shù)據(jù)A加上排他鎖后,則其他事務(wù)不能再對(duì)A加任任何類型的封鎖。獲準(zhǔn)排他鎖的事務(wù)既能讀數(shù)據(jù),又能修改數(shù)據(jù)。
更新鎖:更新 (U) 鎖可以防止通常形式的死鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則兩個(gè)事務(wù)需都要轉(zhuǎn)換共享鎖為排它 (X) 鎖,并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。
若要避免這種潛 在的死鎖問(wèn)題,請(qǐng)使用更新 (U) 鎖。一次只有一個(gè)事務(wù)可以獲得資源的更新 (U) 鎖。如果事務(wù)修改資源,則更新 (U) 鎖轉(zhuǎn)換為排它 (X) 鎖。否則,鎖轉(zhuǎn)換為共享鎖。
鎖的粒度主要有以下幾種類型:
行鎖: 粒度最小,并發(fā)性最高
頁(yè)鎖:一次鎖定一頁(yè)。25個(gè)行鎖可升級(jí)為一個(gè)頁(yè)鎖。
表鎖:粒度大,并發(fā)性低
數(shù)據(jù)庫(kù)鎖:控制整個(gè)數(shù)據(jù)庫(kù)操作
樂(lè)觀鎖:樂(lè)觀鎖假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會(huì)造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候,才會(huì)正式對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測(cè),如果發(fā)現(xiàn)沖突了,則讓返回用戶錯(cuò)誤的信息,讓用戶決定如何去做。一般的實(shí)現(xiàn)樂(lè)觀鎖的方式就是記錄數(shù)據(jù)版本。
悲觀鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖,讀鎖,寫(xiě)鎖等,都是在做操作之前先上鎖。
20、數(shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖是什么? oracle 是行級(jí)鎖
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中,并發(fā)控制的任務(wù)是:確保在多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)時(shí),不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫(kù)的統(tǒng)一性。
悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作
樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性。
21、悲觀鎖和樂(lè)觀鎖的區(qū)別,怎么實(shí)現(xiàn)
悲觀鎖:一段執(zhí)行邏輯加上悲觀鎖,不同線程同時(shí)執(zhí)行時(shí),只能有一個(gè)線程執(zhí)行,其他的線程在入口處等待,直到鎖被釋放。
樂(lè)觀鎖:一段執(zhí)行邏輯加上樂(lè)觀鎖,不同線程同時(shí)執(zhí)行時(shí),可以同時(shí)進(jìn)入執(zhí)行,在最后更新數(shù)據(jù)的時(shí)候要檢查這些數(shù)據(jù)是否被其他線程修改了(版本和執(zhí)行初是否相同),沒(méi)有修改則進(jìn)行更新,否則放棄本次操作。