第二十五章 離線併發與鎖機制
離線併發的**
在web專案中,離線併發顯得尤其嚴重。例如,使用者a和使用者b同時修改資料庫中的某張表的r行,加入r行有兩個字段分別是c1,c2。
假如按照如下過程修改:
1 使用者a將資料r(c1,c2)讀取到a的瀏覽器中。
2 使用者b將資料r(c1,c2)讀取到b的瀏覽器中。
3 使用者a在瀏覽器上將資料修改為r(c1』,c2),同時更新到資料庫。
4 使用者b在瀏覽器上將資料修改為r(c1,c2』),同時更新到資料庫。
上述過程存在兩個問題,第一,第4步b在修改資料的時候資料庫中的資料和b的瀏覽器中資料已經不一致了;第二,如果程式按照哪個字段變化在資料庫中更新哪個欄位的方式處理的話,那麼經過上述四步修改,資料庫中r行的內容是(c1』,c2』),這和a或者b的想法都不同(a認為是(c1』,c2),b認為是(c1,c2』))。
以上的環境叫離線併發。
那麼如何解決離線併發過程中遇到的問題呢?我們引入鎖機制。
鎖機制鎖機制,就是在需要修改的資料上加互斥鎖,通過互斥鎖避免資料被同時修改。鎖機制更具其應用環境又分為樂觀鎖和悲觀鎖
樂觀鎖樂觀鎖,指認為衝突很少發生,所以只是在資料修改的時候比較修改的基礎資料和資料庫中的資料是否相同,相同則修改,否則提示使用者重新裝入資料庫中已經變化的資料。
實現方法1:在進行update的時候使用where條件,在where標間中比較所有上一步中查詢得到的資料。如果資料庫中的資料沒有變化,則update可以更新到內容,否則update語句不能更新到內容,可以根據update的返回值確定更新是否成功。
實現方法2:在每乙個表中追加乙個特殊字段,型別為timestamp,每次更新的時候比較這個欄位的值是否一致,如果一致,則更新,同時將這個字段更新為當前時間,否則,說明資料已經變更。這也可以使用update加上where實現。
悲觀鎖悲觀鎖指,需要修改的資料,在讀取的時候就對資料加鎖,其他使用者在準備修改,讀取資料的階段判斷資料是否上鎖,以此來決定是否進行修改前的讀操作。
實現方法:
通常在資料庫中建立一張lock表,該錶的字段包括,表明,唯一索引,時間,使用者資訊等。
在使用者讀取資料準備修改的時候,首先判斷lock表中是否存在自己將要讀取的資料。
如果不存在,則在lock表中新增一條記錄,記錄對那張表的哪行資料進行修改;如果存在,在判斷時間字段是否超時。
如果超時,則更新lock表中本條記錄的時間字段。(防止死鎖的必要手段)
如果存在,也不超時,說明本條記錄正在被其他使用者修改,則返回併發資訊。
第二十五章 狂風
氈帳外寒風吹,而氈帳內卻很暖和。滕青山喝著熱奶茶,吃了大塊羊肉,還有大盆的手拌炒麵。雖然沒九州大地上菜餚精緻,可也是吃地全身舒坦。大哥!一名穿著灰色皮袍子的青年走進氈帳內。原先正和滕青山談的正高興的查布,見這人進來,不由臉色一沉 你來,有什麼事?嘖嘖。那青年瞥了滕青山一眼,當看到滕青山身上的破棉祅不...
第二十五章 中介者模式
中介者模式 ediator 用乙個中介物件來封裝一系列的物件互動。中介者使物件不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。優點 ediator的出現減少了各個colleague的耦合,使得可以獨立改變和復用各個colleague類和mediator。由於把物件如何協作進...
第二十五章 與WinRT元件互操作
目錄 clr投射與winrt元件型別系統規則 框架投射 用c 定義winrt元件 windows 執行時 元件的目的是公開作業系統最擅長的事情,就是對硬體和跨應用程式的功能進行抽象。所以大多數winrt元件都只是公開了功能,比如儲存,聯網,圖形,安全性,執行緒處理等。winrt元件內部作為 元件物件...