一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

Web開發(fā)必知的八種隔離級別

  ACID性質(zhì)是數(shù)據(jù)庫理論中的奠基石,它定義了一個理論上可靠數(shù)據(jù)庫所必須具備的四個性質(zhì):原子性,一致性,隔離性和持久性。雖然這四個性質(zhì)都很重要,但是隔離性最為靈活。大部分數(shù)據(jù)庫都提供了一些可供選擇的隔離級別,且現(xiàn)在許多庫都增加了附加層來創(chuàng)建顆粒度更細的隔離。隔離級別應(yīng)用范圍如此之廣主要是因為放寬隔離約束往往會使得可擴展性和性能提高幾個數(shù)量級。

  串行一致性是可用的最古老最高的隔離級別之一,它之所以倍受青睞是因為其提供的簡單編程模型,即每次僅能有一個事務(wù)對給定的資源進行操作,這就避免了很多潛在的資源問題。盡管如此,大部分應(yīng)用程序(尤其是Web應(yīng)用程序)都不采用這種級別非常高的隔離,因為從終端用戶的角度來看這是不切實際的-任何一個擁有大量用戶群的應(yīng)用程序在訪問共享資源時都將會有幾分鐘的延遲,而這會使得用戶量迅速減少。弱一致性和最終一致性在大規(guī)模分布式數(shù)據(jù)源中,例如Web中,隨處可見。好幾個成功的大型Web應(yīng)用(例如,eBay和Amazon)都顯示出樂觀的(optimistic)弱一致性要比傳統(tǒng)悲觀的(pessimistic)機制在擴展性方面好得多。本文將一窺八種不同的隔離級別。學會適當?shù)姆艑挃?shù)據(jù)一致性的約束,你可以在自己的應(yīng)用程序中使用這八種隔離級別來獲得更好的性能和可擴展性。

  并發(fā)控制的主要目標是為了確保事務(wù)被隔離且不會影響到其他事務(wù)。要達到高級別的隔離需以犧牲性能為代價。并發(fā)控制可以用悲觀或者樂觀的機制來實現(xiàn)。大部分關(guān)系型數(shù)據(jù)庫都使用了悲觀機制來實現(xiàn)寫入優(yōu)化。悲觀機制采用了鎖,通過使用鎖它可以阻塞一些操作或者進行某些形式的沖突檢測。當一個表格,頁面或是行被修改后,悲觀機制中的鎖可以用來阻塞其他潛在的訪問修改資源的事務(wù)。然而,樂觀機制并不采用任何鎖,它僅僅依賴于沖突檢測來維護事務(wù)隔離。樂觀機制采用的沖突檢測可以允許所有的讀操作,并在事務(wù)結(jié)束時檢驗其一致性。如果檢測到?jīng)_突,那么事務(wù)會進行回滾或重做。大部分web服務(wù)器都是讀入優(yōu)化,因此使用了樂觀機制。通過允許所有的讀入操作,樂觀機制既可以保證很高的讀寫吞吐量,也可以在資源不是一直改變的情況下保證數(shù)據(jù)的一致性。

  下面列出的隔離級別是用來幫助Web開發(fā)人員更好的理解他們編程模型中放置的約束,幫助系統(tǒng)架構(gòu)師和開發(fā)人員共同討論如何在保持必要的數(shù)據(jù)完整性的同時選擇最有效的隔離級別。它們按照最少隔離(未提交讀)到最多隔離(串行化)的順序列出。

  1、未提交讀(Read Uncommitted)

  未提交讀隔離級別需要事務(wù)間很少的隔離。每一個讀操作都能看到事務(wù)中等待的寫操作(臟讀)。然而已經(jīng)提交的寫操作必須要有一個串行順序來防止臟寫。悲觀機制會阻塞有沖突的寫操作直到其他寫操作已經(jīng)被提交或已經(jīng)回滾。樂觀機制不會鎖住這些操作,它會允許所有的操作都通過。如果一個連接進行了回滾,那么接下來修改同一塊數(shù)據(jù)的其他操作也會被回滾。在這種級別中,共享緩沖可以不加驗證的進行使用。這種隔離級別最好在不需要事務(wù)(比如只讀的數(shù)據(jù)集),或者事務(wù)只在獨占數(shù)據(jù)庫時才修改的情況下使用。

  例子:一個只在離線情況下更新的檔案數(shù)據(jù)庫,或者不在事務(wù)中使用的審核/登陸(audit/logging)表。

  2、已提交讀(Read Committed)

  已提交讀可以讀取系統(tǒng)中任何已經(jīng)提交的狀態(tài),并且可以不加驗證(混合狀態(tài))的進行緩沖,只需當前連接中發(fā)生的改變能夠反映到結(jié)果中即可。悲觀機制將其實現(xiàn)為單調(diào)視圖。樂觀事務(wù)則隔離存儲所有的改動,使得它們直到提交后才可用。讀已提交使用一個非常樂觀的機制,它推遲寫入所有的變化直到事務(wù)被提交為止。這種形式的樂觀隔離可以在不阻塞讀操作的情況下實現(xiàn)復(fù)雜的寫入操作,并且它沒有驗證模式。共享緩沖只能在已提交的狀態(tài)中使用。這種隔離級別最好在結(jié)果可以使用舊值,且事務(wù)只能用于寫入操作的情況下使用。

例子:一個不必顯示當前最新帖子的在線論壇,且它的帖子間數(shù)據(jù)不相沖突。

  3、單調(diào)視圖(Monotonic View )

  單調(diào)視圖是對讀已提交的一個擴展,它其中的事務(wù)在執(zhí)行時會觀察數(shù)據(jù)庫中一個單調(diào)上升的狀態(tài)。在這種級別中,如果有明顯的寫入事務(wù),那么悲觀事務(wù)會在讀入操作中被阻塞。樂觀事務(wù)會像在讀已提交中一樣操作,隔離保存所有的改動,并且會驗證它們的緩沖以確保其仍然合法。這種級別可以定期地同步數(shù)據(jù)庫副本,且最好在不需要事務(wù)或者僅存在寫操作事務(wù)的情況下使用。

例子:一個僅能由一個人來修改的用戶偏好表。

  4、快照讀取(Snapshot Reads)

  快照讀取擴展了單調(diào)視圖,它可以保證查詢結(jié)果都能反映到數(shù)據(jù)庫一致的快照中。悲觀機制會在讀操作時阻礙其他影響結(jié)果的寫入操作。樂觀機制則允許其他的寫入操作,并通知讀取事務(wù)某部分已經(jīng)發(fā)生改變并進行回滾。想要實現(xiàn)一個樂觀機制,必須在讀操作結(jié)束之前驗證是否有什么并行的寫入操作修改了結(jié)果,如果有的話,那么結(jié)果可能會重做或回滾。這個檢驗過程可能只是簡單的檢查同一張表中是否出現(xiàn)了寫入操作,或者只是檢查改動的查詢結(jié)果。樂觀隔離級別可以很輕松地檢測出沖突,并且在允許并發(fā)讀入操作的過程中,支持寫入操作。這種級別只要能夠讀取到快照,便可以定期地同步數(shù)據(jù)庫副本。最好在寫入操作很少,不想與讀入操作沖突,且查詢結(jié)果需要一致性的時候使用這種隔離級別。

  例子::一個查詢比修改頻繁,且只保留最新值的貨幣換位表或者查詢表。

  5、游標穩(wěn)定性(Cursor Stability)

  游標穩(wěn)定性隔離擴展了讀已提交,并且是許多關(guān)系型數(shù)據(jù)默認的隔離級別。在這種隔離級別中,悲觀事務(wù)如果在一個單獨的語句中執(zhí)行的話,必須得指定它將修改的記錄。這通常可以在"SELECT"查詢后附加“FORUPDATE”關(guān)鍵字來實現(xiàn)。在這種情況下,其他沖突的讀寫悲觀事務(wù)都將被阻塞直到該事務(wù)結(jié)束為止。樂觀事務(wù)會跟蹤提交時被驗證的所有修改記錄/實體的版本號。這是一種很流行的樂觀隔離級別,因此被所有的主流對象關(guān)系映射庫支持。在Java持久性API中,可以使用FLUSH_ON_COMMIT(盡管查詢可能不影響本地改動)來接近達到這種級別,且如果檢測到?jīng)_突的話,可以拋出OptimisticLockException異常。這種隔離也同樣可以用在HTTP頭域的If-Match或者If-Unmodified-Since中,它可以用來在更新前對比上一個資源的版本或者時間戳。這種級別最好在實體由外部信息(不從數(shù)據(jù)庫中讀取)更改,或者改動不會彼此覆蓋的情況下使用。

  例子:一個共享的公司目錄或者一個wiki。

  6、可重復(fù)讀取(Repeatable Read)

  可重復(fù)讀取級別擴展了游標穩(wěn)定性,它保證事務(wù)內(nèi)的任何數(shù)據(jù)在事務(wù)過程中都不會被修改或者移除。悲觀事務(wù)需要讀取所有記錄上的鎖,并阻塞其他服務(wù)來修改這些記錄。樂觀事務(wù)則會跟蹤所有的記錄或者實體,并檢查它們是否在提交時被修改過。這種級別最好在實體狀態(tài)能夠影響其他實體,或者事務(wù)由讀寫操作構(gòu)成的情況下使用。

  例子:一個訂單跟蹤數(shù)據(jù)庫,它從一個實體中讀取值并用它來計算其他的實體值。

  7、快照隔離(Snapshot Isolation)

  快照隔離擴展了快照讀取和可重復(fù)讀取,它保證事務(wù)中所有進行的讀操作都能看到數(shù)據(jù)庫中一致的快照。事務(wù)執(zhí)行的的任何讀操作都會有相同的結(jié)果,而不管它們在事務(wù)中執(zhí)行的早晚。這和可重復(fù)讀取不同,因為快照隔離能夠防止幻讀(查詢結(jié)果不斷變化)。許多關(guān)系型數(shù)據(jù)庫采用多版本并發(fā)控制(也可以叫做SERIALIZABLE)來支持這種級別,實現(xiàn)方法是通過鎖和沖突檢測的組合。在這種級別中,考慮到它可能與悲觀機制或者樂觀機制相沖突,因此事務(wù)一定要做好回滾的準備。悲觀機制會通過鎖住資源來嘗試減少沖突的機會,但是必須在事務(wù)提交后將這些改動合并。樂觀機制也會使用多版本并發(fā)控制,但是它不會阻塞其他可能產(chǎn)生潛在沖突操作的事務(wù),反而是將沖突的事務(wù)進行回滾。這種級別的隔離最好在事務(wù)可以讀取和修改多個記錄的情況下使用。

  例子:一個基于系統(tǒng)狀態(tài)規(guī)則的工作流系統(tǒng)。

  8、可串行性(Serializability)

  串行性是快照隔離的擴展,它要求所有的事務(wù)都必須一個接著一個的出現(xiàn),就好比它們被串行化過一樣。悲觀機制需要鎖住所有評估過的查詢,以防止寫入操作影響這些結(jié)果。而樂觀機制則跟蹤所有評估過的查詢,并在事務(wù)結(jié)束時使用一個后向驗證或前向驗證的模式來檢查是否有并行寫入操作影響了并行讀入操作,如果有的話,它會將沖突事務(wù)外的所有事務(wù)進行回滾。在這種隔離級別中,任何提交事務(wù)都不會改變系統(tǒng)的表征狀態(tài)。最好在需要完整數(shù)據(jù)一致性的情況下使用這個級別的隔離。

  例子:一個進行范圍查詢來計算新值的賬目系統(tǒng)。

  總結(jié)

  下面是本文提到的隔離級別的匯總表,它可以幫助你找到最適合你應(yīng)用程序的級別。

  事務(wù)在不同隔離級別中可能的沖突類型:

 臟寫臟讀混合狀態(tài)不一致讀覆寫不可重復(fù)幻讀不一致性
未提交讀不可以可以可以可以可以可以可以可以
已提交讀不可以不可以可以可以可以可以可以可以
單調(diào)視圖不可以不可以不可以可以可以可以可以可以
快照讀取不可以不可以不可以不可以d可以可以可以可以
游標穩(wěn)定性不可以不可以可以可以不可以可以可以可以
可重復(fù)讀取不可以不可以可以可以不可以不可以可以可以
快照隔離不可以不可以不可以不可以不可以不可以不可以可以
可串行性不可以不可以不可以不可以不可以不可以不可以不可以

不同隔離級別的最佳前提:

 緩沖數(shù)據(jù)同步樂觀沖突模式建議操作例子
未提交讀允許緩沖間歇的檢測臟寫不能并發(fā)讀寫檔案
已提交讀允許緩沖間歇的沒有沖突檢測單調(diào)的讀/寫Web論壇
單調(diào)視圖必須被驗證周期的沒有沖突檢測組合讀入用戶偏好
快照讀取必須被驗證周期的對比讀入與修改內(nèi)容一致性讀入查詢表
游標穩(wěn)定性允許緩沖間歇的對比修改的實體版本CRUD服務(wù)目錄
可重復(fù)讀取允許緩沖間歇的對比讀入的實體版本讀/寫實體訂單跟蹤
快照隔離必須被驗證周期的對比讀入的實體版本同步實體工作流
可串行性必須被驗證完整同步對比查詢與修改內(nèi)容完善數(shù)據(jù)一致性賬目

  數(shù)據(jù)一致性在數(shù)據(jù)庫應(yīng)用程序中至關(guān)重要-它允許開發(fā)者在分布式環(huán)境下使用數(shù)據(jù)。盡管強一致性級別如可串行性提供了一個簡單的編程模型,但是它們會導(dǎo)致開銷過大,操作阻塞或者事務(wù)回滾,這對于很多應(yīng)用程序來說都是不必要的。如果有其他問題的話,可以使用更加適當?shù)母綦x級別來幫助開發(fā)人員和系統(tǒng)架構(gòu)師,讓他們在保持性能和開銷平衡的前提下更好的理解數(shù)據(jù)一致性的需求。

it知識庫Web開發(fā)必知的八種隔離級別,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品第一页| 久久久精品免费 | 五月婷婷色综合 | 69精品免费视频 | 亚洲涩综合 | 亚洲欧洲精品成人久久曰影片 | 久久精品国产亚洲片 | 成年视频在线 | 夜夜综合 | 五月天婷色 | 日本一区二区三区免费观看 | 激情 婷婷| 91精品国产综合久久青草 | 欧美人与禽zoz0性伦交免费看 | 午夜视频在线看 | 都市激情一区 | 色www免费视频 | 色五夜婷婷 | 丁香婷婷在线观看 | 美女被男人扒开下面无遮无挡 | 婷婷综合激情五月中文字幕 | 国产精品免费福利 | 国产精品综合视频 | 亚洲成片在线观看12345ba | 久久精品国产久精国产 | 青青91视频 | 久久亚洲国产成人精品性色 | 91 久久| 欧美日韩国产亚洲综合不卡 | 国产91精品久久久久久久 | 亚洲国产欧美精品 | 日本一区二区在线播放 | 色成年激情久久综合 | 亚洲国产高清一区二区三区 | 成人黄色小视频在线观看 | 福利一区二区视频 | 国产综合成人久久大片91 | 美女性视频网站 | 国产一区二区三区波多野吉衣 | 国产日韩欧美二区 | 狠狠亚洲 |