數(shù)據(jù)庫程序員面試分類真題4_第1頁
數(shù)據(jù)庫程序員面試分類真題4_第2頁
數(shù)據(jù)庫程序員面試分類真題4_第3頁
數(shù)據(jù)庫程序員面試分類真題4_第4頁
數(shù)據(jù)庫程序員面試分類真題4_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數(shù)據(jù)庫程序員面試分類真題4簡答題1.

什么是反范式?反范式有什么優(yōu)缺點?正確答案:數(shù)據(jù)庫設計要嚴格遵守范式,這樣設計出來的數(shù)據(jù)庫,雖然思路很清晰,結構也很合理,但是,有時候卻要在一定程度上打破范式(江南博哥)設計。因為范式越高,設計出來的表可能越多,關系可能越復雜,但是性能卻不一定會很好,因為表一多,就增加了關聯(lián)性。特別是在高可用的OLTP數(shù)據(jù)庫中,這一點表現(xiàn)得很明顯,所以就引入了反范式。

不滿足范式的模型,就是反范式模型。反范式與范式所要求的正好相反,在反范式的設計模式中,可以允許適當?shù)臄?shù)據(jù)冗余,用這個冗余可以縮短查詢獲取數(shù)據(jù)的時間。反范式其本質上就是用空間來換取時間,把數(shù)據(jù)冗余在多個表中,當查詢時就可以減少或者避免表之間的關聯(lián)。反范式技術也可以稱為反規(guī)范化技術。

反范式的優(yōu)點:減少了數(shù)據(jù)庫查詢時表之間的連接次數(shù),可以更好地利用索引進行篩選和排序,從而減少了I/O數(shù)據(jù)量,提高了查詢效率。

反范式的缺點:數(shù)據(jù)存在重復和冗余,存在部分空間浪費。另外,為了保持數(shù)據(jù)的一致性,必須維護這部分冗余數(shù)據(jù),因此增加了維護的復雜性。所以,在進行范式設計時,要在數(shù)據(jù)一致性與查詢之間找到平衡點,因為符合業(yè)務場景的設計才是好的設計。

范式和反范式的對比見下表。模型優(yōu)點缺點范式化模型數(shù)據(jù)沒有冗余,更新容易當表的數(shù)量比較多,查詢設計需要很多關聯(lián)模型(Join)時,會導致查詢性能低下反范式化模型數(shù)據(jù)冗余將帶來很好的讀取性能(因為不需要關聯(lián)很多表,而且通常反范式模型很少做更新操作)需要維護冗余數(shù)據(jù),從目前NoSQL的發(fā)展可以看到,對磁盤空間的消耗是可以接受的[考點]反范式

2.

常見的數(shù)據(jù)庫反范式技術有哪些?正確答案:在RDBMS模型設計過程中,常常使用范式來約束模型,但在NoSQL模型中則大量采用反范式。常見的數(shù)據(jù)庫反范式技術包括:

1)增加冗余列。在多個表中保留相同的列,以減少表連接的次數(shù)。冗余法以空間換取時間,把數(shù)據(jù)冗余在多個表中,當查詢時可以減少或者避免表之間的關聯(lián)。

2)增加派生列。表中增加可以由本表或其他表中數(shù)據(jù)計算生成的列,減少查詢時的連接操作并避免計算或使用集合函數(shù)。

3)表水平分割。根據(jù)一列或多列的值將數(shù)據(jù)放到多個獨立的表中,主要用于表的規(guī)模很大、表中數(shù)據(jù)相對獨立或數(shù)據(jù)需要存放到多個介質的情況。

4)表垂直分割。對表按列進行分割,將主鍵和一部分列放到一個表中,主鍵與其他列放到另一個表中,在查詢時減少I/O次數(shù)。

例如,有學生表與課程表,假定課程表要經常被查詢,而且在查詢中要顯示學生的姓名,則查詢語句為

SELECTCODE,NAME,SUBJECTFROMCOURSEC,STUDENTSWHERES.ID=C.CODEWHERECODE=?

如果這個語句被大范圍、高頻率地執(zhí)行,那么可能會因為表關聯(lián)造成一定程度的影響,現(xiàn)在,評估到學生改名的需求是非常少的,那么,就可以把學生姓名冗余到課程表中。注意:這里并沒有省略學生表,只不過是把學生姓名冗余在了課程表中,如果萬一有很少的改名需求,只要保證在課程表中改名正確即可。

那么,修改以后的語句可以簡化為

SELECTCODE,NAME,SUBJECTFROMCOURSECWHERECODE=?[考點]反范式

3.

事務可以分為哪幾類?正確答案:從事務理論的角度來看,可以把事務分為以下幾種類型:

1)扁平事務(FlatTransactions)。

2)帶有保存點的扁平事務(FlatTransactionswithSavepoints)。

3)鏈事務(ChainedTransactions)。

4)嵌套事務(NestedTransactions)。

5)分布式事務(DistributedTransactions)。[考點]分類

4.

什么是XA事務?正確答案:XA(eXtendedArchitecture)是指由X/Open組織提出的分布式交易處理的規(guī)范。XA是一個分布式事務協(xié)議,由Tuxedo提出,所以,分布式事務也稱為XA事務。XA協(xié)議主要定義了事務管理器(TransactionManager,TM,協(xié)調者)和資源管理器(ResourceManager,RM,參與者)之間的接口。其中,資源管理器往往由數(shù)據(jù)庫實現(xiàn),例如Oracle、DB2、MySQL,這些商業(yè)數(shù)據(jù)庫都實現(xiàn)了XA接口,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA事務是基于兩階段提交(Two-phaseCommit,2PC)協(xié)議實現(xiàn)的,可以保證數(shù)據(jù)的強一致性,許多分布式關系型數(shù)據(jù)管理系統(tǒng)都采用此協(xié)議來完成分布式。階段一為準備階段,即所有的參與者準備執(zhí)行事務并鎖住需要的資源。當參與者準備好時,向TM匯報自己已經準備好。階段二為提交階段。當TM確認所有參與者都準備好后,向所有參與者發(fā)送COMMIT命令。

XA事務允許不同數(shù)據(jù)庫的分布式事務,只要參與在全局事務中的每個節(jié)點都支持XA事務。Oracle、MySQL和SQLServer都支持XA事務。

XA事務由一個或多個資源管理器(RM)、一個事務管理器(TM)以及一個應用程序(ApplicationProgram)組成。

1)資源管理器:提供訪問事務資源的方法。通常一個數(shù)據(jù)庫就是一個資源管理器。

2)事務管理器:協(xié)調參與全局事務中的各個事務。需要和參與全局事務的所有資源管理器進行通信。

3)應用程序:定義事務的邊界。

XA事務的缺點是性能不好,并且XA無法滿足高并發(fā)場景。一個數(shù)據(jù)庫的事務和多個數(shù)據(jù)庫間的XA事務性能會相差很多。因此,要盡量避免XA事務,例如可以將數(shù)據(jù)寫入本地,用高性能的消息系統(tǒng)分發(fā)數(shù)據(jù),或使用數(shù)據(jù)庫復制等技術。只有在其他辦法都無法實現(xiàn)業(yè)務需求,且性能不是瓶頸時才使用XA。[考點]分類

5.

臟讀、不可重復讀和幻讀的區(qū)別是什么?正確答案:當多個線程都開啟事務操作數(shù)據(jù)庫中的數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)要能進行隔離操作,以保證各個線程獲取數(shù)據(jù)的準確性,所以,對于不同的事務,采用不同的隔離級別會有不同的結果。如果不考慮事務的隔離性,那么會發(fā)生下表所示的3種問題。

臟讀和不可重復讀的區(qū)別:臟讀是某一事務讀取了另一個事務未提交的臟數(shù)據(jù),而不可重復讀則是在同一個事務范圍內多次查詢同一條數(shù)據(jù)卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔期間,該條數(shù)據(jù)被另一個事務修改并提交了。

幻讀和不可重復讀的區(qū)別:幻讀和不可重復讀都是讀取了另一個事務中已經提交的數(shù)據(jù),不同的是不可重復讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一個數(shù)據(jù)整體(例如,數(shù)據(jù)的條數(shù))。[考點]隔離級別

6.

在SQL標準中定義的4種隔離級別分別是什么?正確答案:在SQL標準中定義了4種隔離級別,每一種級別都規(guī)定了一個事務中所做的修改,哪些是在事務內和事務間可見的,哪些是不可見的。較低級別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開銷也更低。SQL標準定義的4種隔離級別:ReadUncommitted(未提交讀)、ReadCommitted(提交讀)、RepeatableRead(可重復讀)、Serializable(可串行化),下面分別介紹。

(1)ReadUncommitted(未提交讀,讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執(zhí)行結果,即在未提交讀級別,事務中的修改,即使沒有提交,對其他事務也都是可見的,該隔離級別很少用于實際。讀取未提交的數(shù)據(jù),也被稱為臟讀。該隔離級別最低,并發(fā)性能高。

(2)ReadlCommitted(提交讀,讀取提交內容)

這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。換句話說,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。

(3)RepeatableRead(可重復讀)

可重復讀可以確保同一個事務,在多次讀取同樣的數(shù)據(jù)的時候,得到同樣的結果??芍貜妥x解決了臟讀的問題,不過理論上,這會導致另一個棘手的問題:幻讀。MySQL數(shù)據(jù)庫中的InnoDB和Falcon存儲引擎通過MVCC(Multi-VersionConcurrentControl,多版本并發(fā)控制)機制解決了該問題。需要注意的是,多版本只是解決不可重復讀問題,而加上間隙鎖(也就是它這里所謂的并發(fā)控制)才解決了幻讀問題。

(4)Serializable(可串行化、序列化)

這是最高的隔離級別,它通過強制事務排序,強制事務串行執(zhí)行,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導致大量的超時現(xiàn)象和鎖競爭。實際應用中也很少用到這個隔離級別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮用該級別。這是花費代價最高但是最可靠的事務隔離級別。隔離級別ReadUncommittedReadCommittedRepeatableReadSerializable簡介在該隔離級別,所有事務都可以看到其他未提交事務的執(zhí)行結果,即在未提交讀級別,事務中的修改,即使沒有提交,對其他事務也都是可見的,該隔離級別很少用于實際。讀取未提交的數(shù)據(jù),也被稱為臟讀。該隔離級別最低,并發(fā)性能高這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。換句話說,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。提交讀是Oracle數(shù)據(jù)庫默認的事務隔離級別可重復讀可以確保同一個事務,在多次讀取同樣的數(shù)據(jù)的時候,得到同樣的結果??芍貜妥x解決了臟讀的問題,不過理論上,這會導致另一個棘手的問題:幻讀。MySQL數(shù)據(jù)庫中的InnoDB和Falcon存儲引擎通過MVCC(多版本并發(fā)控制)機制解決了該問題。需要注意的是,多版本只是解決不可重復讀問題,而加上間隙鎖(也就是所謂的并發(fā)控制)才解決了幻讀問題。可重復讀是MySQL數(shù)據(jù)庫的默認隔離級別這是最高的隔離級別,它通過強制事務排序,強制事務串行執(zhí)行,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導致大量的超時現(xiàn)象和鎖競爭。實際應用中也很少用到這個隔離級別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮用該級別。這是花費代價最高但是最可靠的事務隔離級別臟讀允許

不可重復讀允許允許

幻讀允許允許允許

默認級別數(shù)據(jù)庫

Oracle、SQLServerMySQL

并發(fā)性能最高比ReadUncommitted低比ReadCommitted低最低

不同的隔離級別有不同的現(xiàn)象,并有不同的鎖和并發(fā)機制,隔離級別越高,數(shù)據(jù)庫的并發(fā)性能就越差,4種事隔離級別與并發(fā)性能的關系如下圖所示。

[考點]隔離級別

7.

什么是CAP定理?正確答案:CAP定理又稱CAP原則,它是一個衡量系統(tǒng)設計的準則。CAP定理指的是在一個分布式系統(tǒng)中,Consistency(一致性)、Availability(可用性)、PanitionTolerance(分區(qū)容錯性),三者不可兼得。

1)C(一致性):所有節(jié)點在同一時間的數(shù)據(jù)完全一致。

2)A(可用性):服務一直可用,每個請求都能接收到一個響應,無論響應成功或失敗。

3)P(分區(qū)容錯性):分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡分區(qū)故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。

任何分布式系統(tǒng)在可用性、一致性、分區(qū)容錯性方面,不能兼得,最多只能得其二。因此,任何分布式系統(tǒng)的設計只是在三者中的不同取舍而已。所以,就有了3個分類:CA數(shù)據(jù)庫、CP數(shù)據(jù)庫和AP數(shù)據(jù)庫。傳統(tǒng)的關系型數(shù)據(jù)庫在功能支持上通常很寬泛,從簡單的鍵值查詢,到復雜的多表聯(lián)合查詢,再到事務機制的支持。而與之不同的是,NoSQL系統(tǒng)通常注重性能和擴展性,而非事務機制,因為事務就是強一致性的體現(xiàn)。

1)CA數(shù)據(jù)庫滿足數(shù)據(jù)的一致性和高可用性,但沒有可擴展性,不考慮分區(qū)容忍性,對應的數(shù)據(jù)庫就是普通的關系型數(shù)據(jù)庫RDBMS,例如Oracle、MySQL的單節(jié)點,滿足數(shù)據(jù)的一致性和高可用性。單點數(shù)據(jù)庫是符合這種架構的,例如超市收銀系統(tǒng)、圖書管理系統(tǒng)。

2)CP數(shù)據(jù)庫考慮的是一致性和分區(qū)容錯性,這種數(shù)據(jù)庫對分布式系統(tǒng)內的通信要求比較高,因為要保持數(shù)據(jù)的一致性,需要做大量的交互,例如OracleRAC、Sybase集群。雖然OracleRAC具備一點的擴展性,但當節(jié)點達到一定數(shù)目時,性能(即可用性)就會下降很快,并且節(jié)點之間的網(wǎng)絡開銷還在,需要實時同步各節(jié)點之間的數(shù)據(jù)。CP數(shù)據(jù)庫通常性能不是特別高,例如火車售票系統(tǒng)。

3)AP數(shù)據(jù)庫考慮的是實用性和分區(qū)容忍性,即外部訪問數(shù)據(jù),可以更快地得到回應,例如博客系統(tǒng)。這時候,數(shù)據(jù)的一致性就可能得不到滿足或者對一致性要求低一些,各節(jié)點之間的數(shù)據(jù)同步沒有那么快,但能保證數(shù)據(jù)的最終一致性。比如一個數(shù)據(jù),可能外部一個進程在改寫這個數(shù)據(jù),同時另一個進程在讀這個數(shù)據(jù),此時,數(shù)據(jù)顯現(xiàn)是不一致的。但是有一點,就是數(shù)據(jù)庫會滿足最終一致性的概念,即過程可能是不一致的,但是到某一個終點,數(shù)據(jù)就會一致起來。當前熱炒的NoSQL大多數(shù)是典型的AP類型數(shù)據(jù)庫。[考點]CAP定理

8.

CAP定理和一般事務中的ACID特性中的一致性有什么區(qū)別?正確答案:一般事務的ACID中的一致性是有關數(shù)據(jù)庫規(guī)則的描述,如果數(shù)據(jù)表結構定義一個字段值是唯一的,那么一致性系統(tǒng)將解決所有操作中導致這個字段值非唯一性的情況,如果帶有一個外鍵的一行記錄被刪除,那么其外鍵相關記錄也應該被刪除,這就是ACID一致性的含義。

CAP理論的一致性是保證同一個數(shù)據(jù)在所有不同服務器上的拷貝都是相同的,這是一種邏輯保證,而不是物理上的,因為網(wǎng)絡速度限制,在不同服務器上這種復制是需要時間的,集群通過阻止客戶端查看不同節(jié)點上還未同步的數(shù)據(jù)維持邏輯視圖。[考點]CAP定理

9.

什么是數(shù)據(jù)庫三級封鎖協(xié)議?正確答案:眾所周知,基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖)。所謂X鎖是事務T對數(shù)據(jù)A加上X鎖時,只允許事務T讀取和修改數(shù)據(jù)A。所謂S鎖是事務T對數(shù)據(jù)A加上S鎖時,其他事務只能再對數(shù)據(jù)A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。若事務T對數(shù)據(jù)對象A加了S鎖,則T就可以對A進行讀取,但不能進行更新(S鎖因此又稱為讀鎖),在T釋放A上的S鎖以前,其他事務可以再對A加S鎖,但不能加X鎖。從而可以讀取A,但不能更新A。

在運用X鎖和S鎖對數(shù)據(jù)對象加鎖時,還需要約定一些規(guī)則,例如,何時申請X鎖或S鎖、持鎖時間、何時釋放等,稱這些規(guī)則為封鎖協(xié)議(LockingProtocol)。對封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。一般使用三級封鎖協(xié)議,也稱為三級加鎖協(xié)議。該協(xié)議是為了保證正確的調度事務的并發(fā)操作。三級加鎖協(xié)議是事務在對數(shù)據(jù)庫對象加鎖、解鎖時必須遵守的一種規(guī)則。下面分別介紹這三級封鎖協(xié)議。

一級封鎖協(xié)議:事務T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務結束才釋放。事務結束包括正常結束(COMMIT)和非正常結束(ROLLBACK)。一級封鎖協(xié)議可以防止丟失修改,并保證事務T是可恢復的。使用一級封鎖協(xié)議可以解決丟失修改問題,在一級封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)而不對其進行修改,是不需要加鎖的,它不能保證可重復讀和不讀“臟”數(shù)據(jù)。

二級封鎖協(xié)議:一級封鎖協(xié)議加上事務T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后方可釋放S鎖。二級封鎖協(xié)議除防止了丟失修改,還可以進一步防止讀“臟”數(shù)據(jù)。但在二級封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復讀。

三級封鎖協(xié)議:一級封鎖協(xié)議加上事務T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務結束才釋放。三級封鎖協(xié)議除防止了丟失修改和不讀“臟”數(shù)據(jù)外,還進一步防止了不可重復讀。[考點]數(shù)據(jù)庫三級封鎖協(xié)議和兩段鎖協(xié)議

10.

什么是兩段鎖協(xié)議?正確答案:兩段鎖協(xié)議是指所有事務必須嚴格分為兩個階段對數(shù)據(jù)項進行加鎖和解鎖的操作,第一階段必須為加鎖,第二階段必須為解鎖。一個事務中一旦開始釋放鎖,就不能再申請新鎖了。兩段鎖協(xié)議的目的是保證并發(fā)調度的正確性。也就是說,如果所有操作數(shù)據(jù)庫的事務都滿足兩段鎖協(xié)議,那么這些事務的任何并發(fā)調度策略是可串行性的。

1)在對任何數(shù)據(jù)進行讀、寫操作之前,要申請并獲得對該數(shù)據(jù)的封鎖。

2)每個事務中,所有的加鎖請求先于所有的解鎖請求。

三級封鎖協(xié)議的目的是在不同程序上保證數(shù)據(jù)的一致性。三級封鎖協(xié)議是從鎖的隔離程度來定義,兩段鎖協(xié)議是從加鎖、解鎖順序(會影響事務的并發(fā)調度)的角度來描述。[考點]數(shù)據(jù)庫三級封鎖協(xié)議和兩段鎖協(xié)議

11.

什么是鎖?正確答案:鎖(Lock)機制用于管理對共享資源的并發(fā)訪問,用于多用戶的環(huán)境下,可以保證數(shù)據(jù)庫的完整性和一致性。以商場的試衣間為例,每個試衣間都可供多個消費者使用,因此,可能出現(xiàn)多個消費者同時需要使用試衣間試衣服。為了避免沖突,試衣間裝了鎖,某一個試衣服的人在試衣間里把鎖鎖住,其他顧客就不能再從外面打開了,只能等待里面的顧客試完衣服,從里面把鎖打開,外面的人才能進去。

當多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產生多個事務同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制,則就有可能會讀取和存儲到不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的完整性和一致性。當事務在對某個數(shù)據(jù)對象進行操作前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務就對該數(shù)據(jù)對象有了一定的控制。[考點]基本概念

12.

什么是更新丟失?正確答案:更新丟失是指多個用戶通過應用程序訪問數(shù)據(jù)庫時,由于查詢數(shù)據(jù)并返回到頁面和用戶修改完畢單擊保存按鈕將修改后的結果保存到數(shù)據(jù)庫這個時間段(即修改數(shù)據(jù)在頁面上停留的時間)在不同用戶之間可能存在偏差,從而最先查詢數(shù)據(jù)并且最后提交數(shù)據(jù)的用戶會把其他用戶所做的修改覆蓋掉。當兩個或多個事務選擇同一行數(shù)據(jù),然后基于最初選定的值更新該行時,會發(fā)生丟失更新問題。每個事務都不知道其他事務的存在。最后的更新將重寫由其他事務所做的更新,這將導致數(shù)據(jù)丟失。

簡單來說,更新丟失就是兩個事務都同時更新一行數(shù)據(jù),一個事務對數(shù)據(jù)的更新把另一個事務對數(shù)據(jù)的更新覆蓋了。這是因為系統(tǒng)沒有執(zhí)行任何的鎖操作,因此并發(fā)事務并沒有被隔離開來。Serializable可以防止更新丟失問題的發(fā)生。其他的三個隔離級別都有可能發(fā)生更新丟失問題。Serializable雖然可以防止更新丟失,但是效率太低,通常數(shù)據(jù)庫不會用這個隔離級別,所以,需要其他的機制來防止更新丟失,例如悲觀鎖和樂觀鎖。[考點]基本概念

13.

更新丟失可以分為哪幾類?正確答案:更新丟失可以分為以下兩類。

第一類丟失更新:在A事務撤銷時,把已經提交的B事務的更新數(shù)據(jù)覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬實例就可以看出來。時間取款事務A轉賬事務BT1開始事務

T2

開始事務T3查詢賬戶余額為1000元

T4

查詢賬戶余額為1000元T5

匯入100元把余額改為1100元T6

提交事務T7取出100元把余額改為900元

T8撤銷事務

T9余額恢復為1000元(丟失更新)

A事務在撤銷時,“不小心”將B事務已經轉入賬戶的金額給抹去了。第二類丟失更新:在A事務提交時覆蓋了B事務已經提交的數(shù)據(jù),造成B事務所做操作丟失。時間轉賬事務A取款事務BT1

開始事務T2開始事務

T3

查詢賬戶余額為1000元T4查詢賬戶余額為1000元

T5

取出100元把余額改為900元T6

提交事務T7匯入100元

T8提交事務

T9把余額改為1100元(丟失更新)

上面的例子里由于支票轉賬事務覆蓋了取款事務對存款余額所做的更新,導致銀行最后損失了100元;相反,如果轉賬事務先提交,那么用戶賬戶將損失100元。[考點]基本概念

14.

什么是樂觀鎖和悲觀鎖?正確答案:各種大型數(shù)據(jù)庫所采用的鎖的基本理論是一致的,但在具體實現(xiàn)上各有差別。樂觀鎖和悲觀鎖不是數(shù)據(jù)庫中真正存在的鎖,只是人們在解決更新丟失時的不同的解決方案,體現(xiàn)的是人們看待事務的態(tài)度。下表列出了悲觀鎖和樂觀鎖及其更新丟失的解決方案。名稱悲觀鎖(PessimisticLcck)樂觀鎖(OptimisticLock)描述顧名思義,很悲觀。每次去讀數(shù)據(jù)的時候,都認為別的事務會修改數(shù)據(jù),所以,每次在讀數(shù)據(jù)的時候都會上鎖,防止其他事務讀取或修改這些數(shù)據(jù),這樣導致其他事務會被阻塞,直到這個事務結束顧名思義,很樂觀。每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以,不會上鎖,但是在更新的時候會判斷在此期間別人有沒有去更新這個數(shù)據(jù)。樂觀鎖一般通過增加時間戳字段來實現(xiàn),認為數(shù)據(jù)不會被其他用戶修改,所以,只需要修改屏幕上的信息而不需要鎖應用場數(shù)據(jù)更新比較頻繁的場合數(shù)據(jù)更新不頻繁、查詢比較多的場合,這樣可以提高吞吐量更新丟失解決方案試圖在更新之前把行鎖住,使用SELECT...FORUPDATE,然后更新數(shù)據(jù)1)使用版本列的樂觀鎖定增加NUMBER、TIMESTAMP或DATE列,通過增加一個時間戳列,可以知道最后修改時間。每次修改行時,檢查數(shù)據(jù)庫中這一列的值與最初讀出的值是否匹配。若匹配則修改數(shù)據(jù)且通過觸發(fā)器來負責遞增NUMBER、DATE、TIMESTAMP2)使用校驗和的樂觀鎖定用基數(shù)據(jù)本身來計算一個“虛擬的”版本列,生成散列值進行比較。數(shù)據(jù)庫獨立性好,從CPU使用和網(wǎng)絡傳輸方面來看,資源開銷量大3)使用ORA_ROWSCN的樂觀鎖定建立在OracleSCN的基礎上,在建表時,需要啟用ROWDEPENDENCIES,防止整個數(shù)據(jù)塊的ORA_ROWSCN向前推進??梢杂肧CN_TOTIMESTAMP(ORA_ROWSCN)將SCN轉換為時間格式。將原先的悲觀鎖機制修改為樂觀鎖來控制并發(fā),可以使用ORA_ROWSCN,這樣可以無須增加新列。也可以通過SCN_TO_TIMESTAMP來獲取最后修改時間[考點]基本概念

15.

數(shù)據(jù)庫以及線程發(fā)生死鎖的原理是什么?正確答案:所謂死鎖指的是兩個或兩個以上的進程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,如果無外力作用,那么它們都將無法推進下去。此時,稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。舉一個簡單例子加以說明死鎖,人多好辦事,在程序里面也是如此,如果一個程序需要并行處理多個任務,那么就可以創(chuàng)建多個線程,但是線程多了,往往會產生沖突,當一個線程鎖定了一個資源A,又想去鎖定資源B,而在另一個線程中,鎖定了資源B,又想去鎖定資源A以完成自身的操作,兩個線程都想得到對方的資源,不愿釋放自己的資源,造成兩個線程都在等待,而無法執(zhí)行,此時就是死鎖。[考點]基本概念

16.

產生死鎖的原因有哪些?正確答案:產生死鎖的原因主要有以下3個方面:①系統(tǒng)資源不足;②進程運行推進的順序不合適;③資源分配不當。如果系統(tǒng)資源充足,進程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則,就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。[考點]基本概念

17.

什么是活鎖?什么是死鎖?正確答案:如果事務T1封鎖了數(shù)據(jù)R,事務T2又請求封鎖R,于是T2等待。T3也請求封鎖R,當T1釋放了R上的封鎖之后系統(tǒng)首先批準了T2的清求,T3仍然等待。然后T1又請求封鎖R,當T2釋放了R上的封鎖之后系統(tǒng)又批準了T3的請求……T1有可能永遠等待,這就是活鎖的情形。活鎖的含義是該等待事務等待時間太長,似乎被鎖住了,實際上可能被激活。如果事務T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放。R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務永遠不能結束,形成死鎖。[考點]基本概念

18.

試述活鎖的產生原因和解決方法。正確答案:活鎖產生的原因:當一系列封鎖不能按照其先后順序執(zhí)行時,就可能導致一些事務無限期等待某個封鎖,從而導致活鎖。避免活鎖的簡單方法是采用先來先服務的策略。當多個事務請求封鎖同一數(shù)據(jù)對象時,封鎖子系統(tǒng)按請求封鎖的先后次序對事務排隊,數(shù)據(jù)對象上的鎖一旦釋放就批準申請隊列中第一個事務獲得鎖。[考點]基本概念

19.

MVCC的含義是什么?正確答案:在多用戶的系統(tǒng)里,假設有多個用戶同時讀寫數(shù)據(jù)庫里的一行記錄,那么怎么保證數(shù)據(jù)的一致性呢?一種基本的解決方法是對這一行記錄加上一把鎖,將不同用戶對同一行記錄的讀寫操作完全串行化執(zhí)行,由于同一時刻只有一個用戶在操作,因此一致性不存在問題。但是,它存在明顯的性能問題:讀會阻塞寫,寫也會阻塞讀,整個數(shù)據(jù)庫系統(tǒng)的并發(fā)性能將大打折扣。

MVCC(Multi-VersionConcurrentControl,多版本并發(fā)控制)的目標是在保證數(shù)據(jù)一致性的前提下,提供一種高并發(fā)的訪問性能。在MVCC協(xié)議中,每個用戶在連接數(shù)據(jù)庫時看到的是一個具有一致性狀態(tài)的鏡像,每個事務在提交到數(shù)據(jù)庫之前對其他用戶均是不可見的。當事務需要更新數(shù)據(jù)時,不會直接覆蓋以前的數(shù)據(jù),而是生成一個新的版本的數(shù)據(jù),因此一條數(shù)據(jù)會有多個版本存儲,但是同一時刻只有最新的版本號是有效的。因此,讀的時候就可以保證總是以當前時刻的版本的數(shù)據(jù)可以被讀到,不論這條數(shù)據(jù)后來是否被修改或刪除。

大多數(shù)的MySQL事務型存儲引擎,例如InnoDB、Falcon以及PBXT都不使用簡單的行鎖機制,它們都和MVCC機制來一起使用。MVCC不只使用在MySQL中,Oracle、PostgreSQL以及其他一些數(shù)據(jù)庫系統(tǒng)也同樣使用它。

可以將MVCC看成行級鎖的一種妥協(xié),它在許多情況下避免了使用鎖,同時可以提供更小的開銷。根據(jù)實現(xiàn)的不同,它可以允許非阻塞讀,在寫操作進行時,只鎖定需要的記錄。MVCC會保存某個時間點上的數(shù)據(jù)快照,這意味著事務可以看到一個一致的數(shù)據(jù)視圖,而不管它們需要運行多久。這同時也意味著不同的事務在同一個時間點看到的同一個表的數(shù)據(jù)可能是不同的。

使用MVCC多版本并發(fā)控制相比鎖定模型的主要優(yōu)點是,在MVCC里,對檢索(讀)數(shù)據(jù)的鎖要求與寫數(shù)據(jù)的鎖要求不沖突,所以,讀不會阻塞寫,而寫也從不阻塞讀。在數(shù)據(jù)庫里也有表和行級別的鎖定機制,用于給那些無法輕松接受MVCC行為的應用。不過,恰當?shù)厥褂肕VCC總會提供比鎖更好的性能。

20.

什么是存儲過程?正確答案:存儲過程是用戶定義的一系列sOL語句的集合,涉及特定表或其他對象的任務,用戶可以調用存儲過程,而函數(shù)通常是數(shù)據(jù)庫已定義的方法,它接收參數(shù)并返回某種類型的值,并且不涉及特定用戶表。

存儲過程用于執(zhí)行特定的操作,可以接收輸入?yún)?shù)、輸出參數(shù),返回單個或多個結果集。在創(chuàng)建存儲過程時,既可以指定輸入?yún)?shù)(IN),也可以指定輸出參數(shù)(OUT),通過在存儲過程中使用輸入?yún)?shù),可以將數(shù)據(jù)傳遞到執(zhí)行部分;通過使用輸出參數(shù),可以將執(zhí)行結果傳遞到應用環(huán)境。存儲過程可以使對數(shù)據(jù)庫的管理、顯示數(shù)據(jù)庫及其用戶信息的工作更加容易。[考點]存儲過程

21.

存儲過程有哪些優(yōu)點?正確答案:存儲過程存儲在數(shù)據(jù)庫內,可由應用程序調用執(zhí)行。存儲過程允許用戶聲明變量并且可包含程序流、邏輯以及對數(shù)據(jù)庫的查詢。具體而言,存儲過程的優(yōu)點如下:

1)存儲過程增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和運算。

2)存儲過程可保證數(shù)據(jù)的安全性。

3)通過存儲過程可以使相關的動作在一起發(fā)生,從而維護數(shù)據(jù)庫的完整性。

4)在運行存儲過程前,數(shù)據(jù)庫已對其進行了語法和句法分析,并給出了優(yōu)化執(zhí)行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。

5)可以降低網(wǎng)絡的通信量,因為不需要通過網(wǎng)絡來傳送很多SQL語句到數(shù)據(jù)庫服務器。

6)把體現(xiàn)企業(yè)規(guī)則的運算程序放入數(shù)據(jù)庫服務器中,以便集中控制。[考點]存儲過程

22.

有如下兩張表:

1)用戶資料表:SERV(SERV_lDNUMBER(10),PROD_IDNUMBER(L0),USER_TYPEVARCHAR2(30),TERMINAL_NAMEvARCHAR2(30)),其中,SERV_ID為用戶標識,是SERV表的主鍵;PROD_ID為產品標識;USER_TYPE為用戶類型;TERMINAL_NAME為終端類型。

2)終端類型臨時表:TERMINAL(SERV_IDNUMBER(10),TERMINAL_NAMEVARCHAR2(30))。

在初始化情況下,SERV表的SERV_ID、PROD_ID、USER_TYPE字段值是己知的,TERMINAL_NAME字段是空的,現(xiàn)在要根據(jù):PROD_ID、USER_TYPE字段的值來更新NAME字段。

更新條件為:

1)當條件滿足“PROD_ID=1ANDUSER_TYPE='A'”時,TERMINAL_NAME更新為“固話”。

2)當條件滿足“PROD_ID=1ANDUSER_TYPD='B'”時,TERMINAL_NAME更新為“小靈通”。

3)當條件滿足“PROD_ID=2”時,TERMINAL_NAME更新為“寬帶”。

4)當條件滿足“USER_TYPE='C'”時,TERMINAL_NAME更新為“CDMA”。

5)以上條件均不滿足時,TERMINAL_NAME更新為“-1”。

根據(jù)以上條件,完成存儲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論