併發操作可能破壞事務的隔離性,帶來的資料不一致性包括三類:
1)丟失修改 2)不可重複讀 3)讀「髒」資料
鎖是網路資料庫中的乙個非常重要的概念,當多個使用者同時對資料庫併發操作時,會帶來資料不一致的問題,所以,鎖主要用於多使用者環境下保證資料庫完整性和一致性。
資料庫鎖出現的目的:處理併發問題
從資料庫系統角度,基本的鎖型別有兩種:排它鎖(exclusive lock)和共享鎖(shared lock).
排它鎖(x鎖),也稱為寫鎖,表示對資料進行寫操作。
當事務t對資料a加上x鎖時,只允許事務t讀取和修改資料a
共享鎖(s鎖),也稱為讀鎖,用於所有的唯讀資料操作。
當事務t對資料a加上s鎖時,其他事務只能再對資料a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。
若事務t對資料物件a加了s鎖,則t就可以對a進行讀取,但不能進行更新(讀鎖),在t釋放a上的s鎖以前,其他事務可以再對a加s鎖,但不能加x鎖,從而可以讀取a,但不能更新a。
封鎖協議:在運用x鎖和s鎖對資料物件加鎖時,還需要約定一些規則 ,例如何時申請x鎖或s鎖、持鎖時間、何時釋放等。稱這些規則為封鎖協議(locking protocol)。對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議。
1)一級封鎖協議
一級封鎖協議是:事務t在修改資料r之前必須先對其加x鎖,直到事務結束才釋放。事務結束包括正常結束(commit)和非正常結束(rollback)。
一級封鎖協議可以防止丟失修改,並保證事務t是可恢復的。使用一級封鎖協議可以解決丟失修改問題。
在一級封鎖協議中,如果僅僅是讀資料不對其進行修改,是不需要加鎖的,它不能保證可重複讀和不讀「髒」資料。
2)二級封鎖協議
二級封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完後方可釋放s鎖。
二級封鎖協議除防止了丟失修改,還可以進一步防止讀「髒」資料。但在二級封鎖協議中,由於讀完資料後即可釋放s鎖,所以它不能保證可重複讀。
3)**封鎖協議
**封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放。
**封鎖協議除防止了丟失修改和不讀「髒」資料外,還進一步防止了不可重複讀。
mysql併發操作引發的一些思考
最近公司專案中用到了關係型資料庫mysql,其中會涉及到併發操作,之前也用過mysql,但是只是停在了簡單的用上面 老大搭好架子 寫好demo,我模仿 趁放假好好看看相關的資料,解決一下我一直以來的疑惑。在網上查閱文章的過程中,我對mysql有了新的認識,對鎖 事務等有了了解。感覺要深入理解mysq...
ftp協議的簡單介紹以及相關操作
region webclient上傳 webclient client new webclient new networkcredential lyc lyc 第乙個引數表示要上傳到的伺服器的位址,注意需要自己定義上傳之後的檔名稱,第二引數表示姚上傳的本地檔案路徑 上傳成功 endregion 例項...
併發操作的資料安全問題
多執行緒執行環境下肯定存在併發,會存在乙個物件被多個執行緒同時操作 對同一資料的訪問 的情況,這樣如果不加以控制,很容易存在資料安全問題。下面以乙個銀行轉賬的例子來說明併發可能存在的問題 模擬賬戶 account類 public class account public string getname...