本節併發講解多用戶同時訪問同一個數據時,引發的數據不一致性,數據失效性,即咱們開發中的事務處理以及版本控制。 web
執行語境,從外界交互的角度看,有兩個重要的執行語境:請求和會話。請求即調用,請求添加一個用戶等等。會話是客戶端和服務器端一次長時間的交互,能夠是單獨的請求,也能夠是屢次請求組成的,如登錄到添加用戶。(session 保存會話狀態) 數據庫
併發的解決方案:隔離(isolation)、不變性(immutability) 安全
在讀數據時添加讀鎖(read lock,共享鎖),寫數據添加寫鎖(write lock,排它鎖),讀鎖發生時,可多人同時加鎖,可是不能加寫鎖。另一種狀況是,加了寫鎖,則都不能加上讀鎖。 服務器
當一個加上寫鎖以後,另外也要加上寫鎖,則只能等待到前一個完成以後,才能進行。死鎖出現的緣由是人們在已經獲得鎖的狀態下,還但願獲得更多的鎖,因此防止死鎖的發生就是強制人們一次性讀取全部可能須要的鎖,同時加上超時控制和檢測機制處理。 session
你們對事務都足夠了解了,操做要麼成功要麼失敗。事務有四個特性: 併發
用事務資源來表示能夠進行事務處理的任何事物—即便用事務來控制併發過程。(數據庫控制事務,過程開啓事務,結束事務) svn
即事務的四個級別的選擇: atom
隔離級別 spa |
髒讀 線程 |
不可重複讀 |
幻讀 |
讀未提交 |
是 |
是 |
是 |
讀已提交 |
否 |
是 |
是 |
可重複讀 |
否 |
否 |
是 |
可串行化 |
否 |
否 |
否 |
系統事務即數據庫自己要實現的事務處理,如寫成功,業務事務爲程序所定義的事務。
採用樂觀離線鎖,侷限是:只能在提交數據時才發現業務事務將要失敗,代價變大,輸入了一個小時的東西,結果失敗了。
咱們經常使用的web服務器都採用每個會話一個進程,採用線程安全。
併發是計算機系統必須面對的問題,無論在哪一個方面,即便在現實社會也不例外,咱們的大腦一次處理一個事情成功率高不少與一次處理多個事情,你們作飯的話會有很好的體會。