企業應用架構模式學習(五):併發

前言

本節併發講解多用戶同時訪問同一個數據時,引發的數據不一致性,數據失效性,即咱們開發中的事務處理以及版本控制。 web

併發問題

  • 更新丟失(lost updates):當兩個用戶同時操做一條數據時,A讀取了數據進行操做,在A提交數據以前,B進行了數據的更改,若是A此時提交成功,則B修改的數據被丟失掉了。
  • 不一致性(inconsistent read):當用戶A在訪問多個數據時,因爲時間較長,在此期間,另外一個用戶B刪除了其中的數據,此時A取到的數據就不是一致的。

執行語境

執行語境,從外界交互的角度看,有兩個重要的執行語境:請求和會話。請求即調用,請求添加一個用戶等等。會話是客戶端和服務器端一次長時間的交互,能夠是單獨的請求,也能夠是屢次請求組成的,如登錄到添加用戶。(session 保存會話狀態) 數據庫

隔離與不變性

併發的解決方案:隔離(isolation)、不變性(immutability) 安全

  • 隔離:對修改隔離,同一時刻只能一個用戶修改,在用戶對修改未提交或者放棄修改以前,其餘用戶都不能進行修改,修改獨佔,固然在web環境中實現難度較大,用戶能夠輕易的獲取獨佔,可是放棄是難於捕獲的,因此如今有行記錄版本控制,非最新版本不能保存修改。
  • 不變性:分離數據中不變的地方。

樂觀併發控制和悲觀併發控制

  • 樂觀鎖:兩我的都能獲得一個文件的拷貝,均可以自由的編輯,先提交的先保存,後提交的有衝突則不能保存,咱們的svn都採用這種控制。(衝突監測)
  • 悲觀鎖:當A獲得一個文件時,其餘人不能修改。(衝突避免)

避免不一致讀:

在讀數據時添加讀鎖(read lock,共享鎖),寫數據添加寫鎖(write lock,排它鎖),讀鎖發生時,可多人同時加鎖,可是不能加寫鎖。另一種狀況是,加了寫鎖,則都不能加上讀鎖。 服務器

死鎖

當一個加上寫鎖以後,另外也要加上寫鎖,則只能等待到前一個完成以後,才能進行。死鎖出現的緣由是人們在已經獲得鎖的狀態下,還但願獲得更多的鎖,因此防止死鎖的發生就是強制人們一次性讀取全部可能須要的鎖,同時加上超時控制和檢測機制處理。 session

事務

你們對事務都足夠了解了,操做要麼成功要麼失敗。事務有四個特性: 併發

ACID

  • 原子(atomicity)
  • 一致性(consistency)
  • 隔離性(isolation)
  • 持久性(durability)

事務資源

用事務資源來表示能夠進行事務處理的任何事物—即便用事務來控制併發過程。(數據庫控制事務,過程開啓事務,結束事務) svn

減小事務隔離以提升靈活性

即事務的四個級別的選擇: atom

隔離級別 spa

髒讀 線程

不可重複讀

幻讀

讀未提交

讀已提交

可重複讀

可串行化

 

業務事務和系統事務

系統事務即數據庫自己要實現的事務處理,如寫成功,業務事務爲程序所定義的事務。

離線併發控制的模式

採用樂觀離線鎖,侷限是:只能在提交數據時才發現業務事務將要失敗,代價變大,輸入了一個小時的東西,結果失敗了。

應用服務器併發

咱們經常使用的web服務器都採用每個會話一個進程,採用線程安全。

 

 

併發是計算機系統必須面對的問題,無論在哪一個方面,即便在現實社會也不例外,咱們的大腦一次處理一個事情成功率高不少與一次處理多個事情,你們作飯的話會有很好的體會。

相關文章
相關標籤/搜索