資源描述:
《數(shù)據(jù)庫事務(wù)隔離級別與鎖》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、數(shù)據(jù)庫事務(wù)隔離級別與鎖一,事務(wù)的4個基本特征Atomic(原子性):事務(wù)中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。Consistency(一致性):只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫,否則事務(wù)應(yīng)該將其回滾到最初狀態(tài)。Isolation(隔離性):事務(wù)允許多個用戶對同一個數(shù)據(jù)進行并發(fā)訪問,而不破壞數(shù)據(jù)的正確性和完整性。同時,并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨立。Durability(持久性):事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須能夠得到固化。以上屬于廢話二,為什么需要對事務(wù)并發(fā)控制如果不對事務(wù)進
2、行并發(fā)控制,我們看看數(shù)據(jù)庫并發(fā)操作是會有那些異常情形Lostupdate:兩個事務(wù)都同時更新一行數(shù)據(jù),但是第二個事務(wù)卻中途失敗退出,導(dǎo)致對數(shù)據(jù)的兩個修改都失效了。DirtyReads:一個事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時提交。這是相當(dāng)危險的,因為很可能所有的操作都被回滾。Non-repeatableReads:一個事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。Secondlostupdatesproblem:無法重復(fù)讀取的特例。有兩個并發(fā)事務(wù)同時讀取同一行數(shù)據(jù),然后其中一個對它進行修改
3、提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。PhantomReads:事務(wù)在操作過程中進行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務(wù)插入數(shù)據(jù)造成的。三,數(shù)據(jù)庫的隔離級別為了兼顧并發(fā)效率和異常控制,在標(biāo)準(zhǔn)SQL規(guī)范中,定義了4個事務(wù)隔離級別,(ORACLE和SQLSERER對標(biāo)準(zhǔn)隔離級別有不同的實現(xiàn))ReadUncommitted:直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別的事務(wù)可以讀到這個改變.這是很不
4、安全的.ReadCommitted:直譯就是"讀提交",意思就是語句提交以后即執(zhí)行了COMMIT以后別的事務(wù)就能讀到這個改變.RepeatableRead:直譯就是"可以重復(fù)讀",這是說在同一個事務(wù)里面先后執(zhí)行同一個查詢語句的時候,得到的結(jié)果是一樣的.Serializable:直譯就是"序列化",意思是說這個事務(wù)執(zhí)行的時候不允許別的事務(wù)并發(fā)執(zhí)行.四,隔離級別對并發(fā)的控制下表是各隔離級別對各種異常的控制能力。LUDRNRRSLUPRRUYYYYYRCNNYYYRRNNNNYSNNNNN(注:LU:丟失更新;DR:臟讀;NRR:非重復(fù)
5、讀;SLU:二類丟失更新;PR:幻像讀)順便舉一小例。MS_SQL:--事務(wù)一settransactionisolationlevelserializablebegintraninsertintotestvalues('xxx')--事務(wù)二settransactionisolationlevelreadcommittedbegintranselect*fromtest--事務(wù)三settransactionisolationlevelreaduncommittedbegintranselect*fromtest在查詢分析器中執(zhí)行事務(wù)
6、一后,分別執(zhí)行事務(wù)二,和三。結(jié)果是事務(wù)二會等待,而事務(wù)三則會執(zhí)行。ORACLE:--事務(wù)一settransactionisolationlevelserializable;insertintotestvalues('xxx');select*fromtest;--事務(wù)二settransactionisolationlevelreadcommitted--ORACLE默認(rèn)級別select*fromtest執(zhí)行事務(wù)一后,執(zhí)行事務(wù)二。結(jié)果是事務(wù)二只讀出原有的數(shù)據(jù),無視事務(wù)一的插入操作。讀者是否發(fā)現(xiàn)MS_SQL和ORACLE對并發(fā)控制的處
7、理有所不同呢?五,鎖下表是鎖的兼容或沖突情形?,F(xiàn)有SUX請求SYYNUYNNXNNN現(xiàn)有SUX申請SYYNUYNNXNNNoracle:??六,隔離級別與鎖七,注意點一般處理并發(fā)問題時的步驟:1、開啟事務(wù)。2、申請寫權(quán)限,也就是給對象(表或記錄)加鎖。3、假如失敗,則結(jié)束事務(wù),過一會重試。4、假如成功,也就是給對象加鎖成功,防止其他用戶再用同樣的方式打開。5、進行編輯操作。6、寫入所進行的編輯結(jié)果。7、假如寫入成功,則提交事務(wù),完成操作。8、假如寫入失敗,則回滾事務(wù),取消提交。9、(7.8)兩步操作已釋放了鎖定的對象,恢復(fù)到操作前
8、的狀態(tài)。對多表的操作最好一起取得鎖,或則保證處理順序;個人感覺還是前者好,雖然效率低一些八,附查看鎖ORACLE:selectobject_name,session_id,os_user_name,oracle_username,process,l