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