離線併發:多個資料庫事務中支援多執行緒的各種應用伺服器
1. 併發問題:
1)丟失更新(同時編輯檔案,相繼儲存,最終丟失先儲存者更新的內容)
2)不一致性(讀取期間,資料有更新)
2. 執行語境:
1)從與外界互動角度看的2個語境:
請求:
對應於軟體工作的外部環境發出的單個呼叫,處理請求的軟體會決定是否返回一個應答(過程大部分是在伺服器端進行,而客戶端則假設為在等待應答)
會話:
客戶端和伺服器端之間一次長時間的互動
2)作業系統的2個語境:
程式:
重量級的執行語境,將其正在處理的內部資料域外部隔離開(有效隔離,減少衝突,但需要消耗很多資源)
執行緒:
輕量級的執行語境,一個單獨的程式裡可以存在多個執行緒(可以充分利用資源,但易導致併發問題)
3. 隔離與不變性:
企業應用2個解決方案:
1)隔離:
方案1:
劃分資料,使得每一個片資料都只能被一個執行單元訪問(作業系統為每個程式單獨分配一片記憶體,並且只有這個程式可以對這片記憶體進行讀寫操作)
方案2:
檔案鎖,一個人開啟檔案,其他人再無法開啟或者只開啟該檔案只讀拷貝並且不能修改(好的併發設計應該是:找到各種建立隔離區的辦法,並且保證在每個隔離區裡能夠完成儘可能多的任務)
2)不變性:
方案1:
識別哪些是不變的資料(只有在共享資料可以修改的情況下,併發問題才會出現),不用考慮這些資料的併發問題二廣泛地共享它們
方案2:
把那些只讀取資料的程式分開,讓他們只是用拷貝的資料來源
4. 樂觀併發控制盒悲觀併發控制:
1)2種鎖:
樂觀鎖:
關於衝突檢測的(僅當提交更新時才檢查衝突)
優點:併發性高,限制較少,使用起來比較自由
缺點:業務資料比較複雜,難以自動合併,並且使用者難以發現差別時,只能丟棄原有資料,從頭開始更新
悲觀鎖:
關於衝突避免的(只要有人已是用當前資料或者檔案,拒絕其他人使用當前資料或檔案)
優點:減少併發程度
缺點:使用者體驗差
兩種策略選擇標準:衝突的頻率與嚴重性(衝突少或者衝突後果不嚴重時,選擇樂觀鎖;否則選擇悲觀鎖)
2)避免不一致性:
a. 檢測不一致讀:
悲觀策略:
通過讀加鎖(read lock,共享鎖)和寫加鎖(write lock,排他鎖),可以一次多個人對同一份資料加只讀鎖,但只要有人得到一個只讀鎖,其他人就都無法得到寫鎖;一旦有人得到一個寫鎖,其他人都不能得到兩種所中任意一種
樂觀策略:
基於資料的某種版本標識(時間戳或者順序計數器),核對將要更新資料的版本標識和共享資料的版本標識,如果兩者一樣,系統允許更新資料並更新共享資料的版本標識
b. 時序讀:
每次讀取資料時都是用某種時間戳或其他不變的標籤作為約束條件,資料庫根據時間或者標籤返回資料(原始碼控軟體可以用,但資料庫比較困難並且代價昂貴)
3)死鎖:
處理死鎖的方法:
a. 用軟體來檢測死鎖的發生,選擇一個犧牲者,放棄他的工作和他所加的鎖;
b. 給每個鎖都加上時間限制,一旦達到時間限制,所加的鎖就會失效,工作就會丟失;
防止死鎖的方法:
強制人們在開始工作時就獲得所有可能需要的鎖,在此之後就不再允許得到更多的鎖;
可以硬性規定每個人獲得鎖的順序(如按姓名字母順序)
5. 事務:
1)ACID:
原子性、一致性、隔離性、永續性
2)事務資源:
定義:可以進行事務處理的任何事物
事務控制方法:
保證事務儘可能短(儘可能不讓事務跨越多個請求,跨越多個請求的事務稱為長事務);
儘可能晚開啟事務
3)減少事務隔離以提高靈活性:
SQL的4種隔離級別:
可序列化的、可重複讀、讀已提交、讀未提交
不必給所有的事務設定相同的隔離級別,而應該仔細觀察每個事務並根據每個事務具體情況來決定如何權衡靈活性與正確性
4)業務事務和系統事務:
系統事務:
由關聯式資料庫系統和事務監視器所支援的事務 (一般不用幹預)
業務事務:
簡單辦法:在單個系統事務中執行完整的業務事務(產生長系統事務);
複雜的,採用離線併發(通過工作單元來儲存更新資料)
6. 離線併發控制的模式:
樂觀離線鎖、悲觀離線鎖
7. 應用伺服器併發:
每會話一執行緒 VS 每會話一程式:執行緒節省資源,但建立和進入隔離區很重要