我瞭解樂觀鎖定和悲觀鎖定之間的區別。 如今有人能夠向我解釋我何時通常使用其中一個? 數據庫
並根據我是否使用存儲過程執行查詢而改變了這個問題的答案? 服務器
但僅檢查一下,樂觀的意思是「閱讀時不要鎖住桌子」,悲觀的意思是「閱讀時鎖住桌子」。 併發
樂觀假設您在閱讀時不會有任何改變。 分佈式
悲觀主義者假設某件事會所以而將其鎖定。 高併發
若是不必定要完美讀取數據,請使用樂觀的方法。 您可能會讀到奇怪的「骯髒」字樣-但致使死鎖等可能性的可能性要小得多。 spa
大多數Web應用程序均可以進行髒讀-在極少數狀況下,數據不能徹底符合下一次從新加載的要求。 設計
對於精確的數據操做(例如在許多金融交易中),請使用悲觀的。 準確讀取數據且沒有未顯示的更改很是重要-額外的鎖定開銷是值得的。 server
哦,Microsoft SQL Server默認使用頁面鎖定-基本上是您正在讀取的行,而且兩側都有。 行鎖定更準確,但速度慢得多。 一般值得將事務設置爲已提交讀或未鎖定,以免在讀取時出現死鎖。 htm
當您不但願發生太多衝突時,將使用樂觀鎖定。 進行正常操做的成本較低,可是若是發生衝突,您將付出更高的代價來解決該事務,由於事務停止了。 事務
當預期發生衝突時,將使用悲觀鎖定。 違反同步的事務將被簡單地阻止。
要選擇適當的鎖定機制,您必須估計讀取和寫入的數量並作出相應的計劃。
樂觀鎖定是一種策略,您能夠在其中讀取記錄,記下版本號(執行此操做的其餘方法包括日期,時間戳或校驗和/哈希),並在寫回記錄以前檢查版本是否未更改。 當您將記錄寫回時,您將過濾該版本的更新以確保它是原子的。 (即,在您檢查版本並將記錄寫入磁盤之間,還沒有進行更新)和一次單擊便可更新版本。
若是記錄髒了(即與您的版本不一樣),則停止事務,用戶能夠從新啓動它。
此策略最適用於不必定要爲會話保留與數據庫的鏈接的大容量系統和三層體系結構。 在這種狀況下,客戶端實際上沒法維護數據庫鎖定,由於鏈接是從池中獲取的,而且您可能不會在一個訪問到下一個訪問中使用相同的鏈接。
悲觀鎖定是指您鎖定記錄以供獨佔使用,直到完成記錄爲止。 它具備比樂觀鎖定更好的完整性,可是須要您謹慎設計應用程序,以免死鎖 。 要使用悲觀鎖定,您須要直接鏈接到數據庫(一般在兩層客戶端服務器應用程序中就是這種狀況)或能夠獨立於鏈接使用的外部可用事務ID。
在後一種狀況下,您可使用TxID打開事務,而後使用該ID從新鏈接。 DBMS保持鎖定狀態,並容許您經過TxID備份會話。 這就是使用兩階段提交協議(例如XA或COM + Transactions )的分佈式事務的工做方式。
除了已經說過的內容外,還應該說樂觀鎖定傾向於以犧牲可預測性爲代價來提升併發性。 悲觀鎖定傾向於減小併發性,可是更可預測。
你付錢等等
我會想到悲觀鎖定將是一個更好的選擇的狀況。
爲了實現樂觀鎖定,每一個數據修改參與者都必須贊成使用這種鎖定方式。 可是,若是有人修改數據而不關心版本列,則將破壞樂觀鎖定的整個想法。