天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

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

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

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

  1、未提交讀(Read Uncommitted)

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

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

  2、已提交讀(Read Committed)

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

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

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

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

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

  4、快照讀取(Snapshot Reads)

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

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

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

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

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

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

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

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

  7、快照隔離(Snapshot Isolation)

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

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

  8、可串行性(Serializability)

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

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

  總結(jié)

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

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

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

不同隔離級(jí)別的最佳前提:

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

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

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

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

主站蜘蛛池模板: 伊人免费在线 | 内射无码AV-区二区在线观看 | 中文无码熟妇人妻AV在线 | 2019在秋霞理论 | 在线播放免费人成视频 | 色拍拍噜噜噜啦啦新网站 | 中文字幕 亚洲 有码 在线 | 三级中国免费的 | 嘟嘟嘟影院免费观看视频 | 久久人妻熟女中文字幕AV蜜芽 | 三八成人网 | 快插我我好湿啊公交车上做 | 偷窥 亚洲 色 国产 日韩 | 亚洲欧美另类无码专区 | 亚洲三级视频在线观看 | 女人和男人插曲视频大全 | 校园纯肉H教室第一次 | 少妇一夜未归暴露妓女身份 | 和美女啪啪啪动态图 | 国内精品久久久久影院网站 | 午夜福利免费体检区 | 亚洲精品视频在线观看视频 | 久久只精品99品免费久 | 中文字幕亚洲第一 | 色内射无码AV | 国产欧美一区二区三区在线看 | 久久久中日AB精品综合 | GOGOGO高清在线播放免费 | 亚洲午夜精品A片久久不卡蜜桃 | 免费毛片试看 | 美女诱惑性感揉胸 | 男gv纯肉免费视频 | 男女无遮挡吃奶gift动态图 | JAVASCRIPTJAVA水多多| 国产精品色无码AV在线观看 | 曰本熟妇乱妇色A片在线 | CHINESE老阿姨免费视频 | 三级黄色片免费观看 | 观赏女性排尿 | 亚洲不卡高清免v无码屋 | 精品国产免费人成视频 |