髒讀、幻讀、不可重複讀和遺失更新實例
2017年6月5日,天氣-下雨。
前兩天整理之前的學習筆記時,發現對事務並發產生的問題——髒讀、幻讀、不可重複讀和丟失更新這些概念有點模糊,於是又重新溫習了一遍,現在把自己的一些理解歸納整理如下,方便大家學習。
鎖定是防止其他事務存取指定資源的手段。鎖是實現並發控制的主要方法,也是多個使用者能夠同時操縱同一個資料庫中的資料而不發生資料不一致現象的重要保障。 一般來說,鎖可以防止髒讀、不可重複讀和幻讀。
1.髒讀(Dirty Read)-一個事務讀取到了另外一個事務沒有提交的資料。
詳細解釋:當一個事務正在存取數據並且對數據進行了修改,而這種修改還沒有提交到資料庫中,這時另外一個事務也訪問這個數據,然後使用了這個數據。因為這個數據是還沒有提交的數據,那麼另外一個事務讀到的這個數據是髒數據,而依據髒數據所做的操作可能是不正確的。
事務T1:更新一筆資料
-->事務T2:讀取事務T1更新的記錄
事務T1:呼叫commit進行提交
此時事務T2讀取到的數據是保存在資料庫記憶體中的數據,稱為髒數據,這個過程稱為髒讀。
髒讀發生在一個事務A讀取了被另一個事務B修改,但是還未提交的資料。假如B回退,則事務A讀取的是無效的資料。這跟不可重複讀取類似,但是第二個交易不需要執行提交。
解決髒讀問題:修改時加排他鎖,直到事務提交後才釋放,讀取時加上共享鎖,讀取完釋放事務1讀取資料時加上共享鎖後(這樣在事務1讀取數據的過程中,其他事務就不會修改該數據),不允許任何事務操作該數據,只能讀取,之後1如果有更新操作,那麼會轉換為排他鎖,其他事務更無權參與進來讀寫,這樣就防止了髒讀問題。但是當事務1讀取數據過程中,有可能其他事務也讀取了該數據,讀取完畢後共享鎖釋放,此時事務1修改數據,修改完畢提交事務,其他事務再次讀取數據時候發現數據不一致,就會出現不可重複讀問題,所以這樣不能夠避免不可重複讀問題。
2.幻讀(Phantom)-在同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同。
詳細解釋:幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好像發生了幻覺一樣。
事務T1:查詢表中所有記錄
-->事務T2:插入一筆記錄
-->事務T2:調用commit提交
#T1:再次詢問表格中所有記錄
#此時事務T1兩次所詢問的記錄是不一樣的,稱為幻讀。
注意:幻讀重點在新增或刪除。
幻讀發生在當兩個完全相同的查詢執行時,第二次查詢所傳回的結果集合跟第一個查詢不相同。
發生的情況:沒有範圍鎖定。
如何避免:實行序列化隔離模式,在任何一個低層級的隔離中都可能會發生。
解決幻讀問題:採用的是範圍鎖定RangeS RangeS_S模式,鎖定檢索範圍為唯讀,這樣就避免了幻讀問題。
3.不可重複讀取(Nonrepeatable Read)-在同一筆交易中,兩次讀取相同數據,得到內容不同。
事務T1:查詢一筆記錄
-->事務T2:更新事務T1查詢的記錄
-->事務T2:呼叫commit進行提交
T1:再次詢問事務上次的記錄
#此時事務T1對相同資料查詢了兩次,可獲得的內容不同,稱為無法重複讀取。
注意:不可重複讀取重點在修改。
在基於鎖定的平行控制方法中,如果在執行select時不新增讀鎖,就會發生不可重複讀取問題。
在多版本並行控制機制中,當一個遇到提交衝突的交易需要回退但卻被釋放時,會發生不可重複讀取問題。
有兩個策略可以防止這個問題的發生:
(1) 延遲事務2的執行,直到事務1提交或回退。這種策略在使用鎖時會應用。
(2) 而在多版本並行控制中,事務2可以先提交,而事務1繼續執行在舊版本的資料上。當事務1終於嘗試提交時,資料庫會檢驗它的結果是否和事務1、事務2順序執行時一樣。如果是,則事務1提交成功;如果不是,事務1會被回退。
解決不可重複讀取問題:讀取資料時加上共享鎖,寫資料時加排他鎖,都是交易提交才釋放鎖。讀取時候不允許其他事物修改該數據,不管數據在事務過程中讀取多少次,數據都是一致的,避免了不可重複讀取問題。
4.遺失更新(Lost Update)
交易T1讀取了數據,並執行了一些操作,然後更新資料。事務T2也做相同的事,則T1和T2更新資料時可能會覆蓋對方的更新,從而造成錯誤。
5.處理上述隔離等級的問題,採用下列方法:
事務隔離五個層級:
(1)TRANSACTION_NONE 不使用事務。
(2)TRANSACTION_READ_UNCOMMITTED 允許髒讀。
(3)TRANSACTION_READ_COMMITTED 防止髒讀,最常用的隔離等級,且是大多數資料庫的預設隔離等級。
(4)TRANSACTION_REPEATABLE_READ 可防止髒讀與無法重複讀取。
(5)TRANSACTION_SERIALIZABLE 可防止髒讀,無法重複讀取和幻讀,(事務串列化)會降低資料庫的效率。
以上的五個交易隔離等級都是在Connection介面中定義的靜態常數,使用setTransactionIsolation(int level) 方法可以設定交易隔離等級。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。
注意:交易的隔離等級受資料庫的限制,不同的資料庫支援的隔離等級不一定相同。
#
以上是髒讀、幻讀、不可重複讀和遺失更新實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

<p>Xlive.dll是Microsoft的一個動態連結函式庫(DLL),它是「WindowsLive遊戲」的一部份。由Xlive.dll引起的錯誤可能是由於Xlive.dll檔案的刪除、放錯位置、被惡意軟體損壞或登錄項目搞砸了。由於此錯誤而無法啟動程式或遊戲可能會令人沮喪。讓我們看看解決這個問題的方法。此問題通常可以透過正確重新安裝Xlive.dll檔案來解決。 </p><p><strong&

很多小夥伴用右鍵點擊桌面的時候,發現清單裡的新建不見了,這是怎麼一回事呢?有可能是殺毒軟體自動清理了一些文件,其實我們只要進入設定裡調整一下數值就可以恢復了,具體的教學下面跟小編一起來看看吧。恢復Win10右鍵新建的步驟第一步,“win+R”打開運行,輸入:regedit,點擊“確定”,打開註冊表編輯器第二步,在打開的註冊表編輯器窗口,展開HKEY_CLASSES_ROOT,在HKEY_CLASSES_ROOT展開項中找到:Directory,再依序展開:Directory\Background

如何解決win7計算機中d3dx9_43.dll遺失的問題? 3dx9_43.dll是電腦系統組件中directX9的dl組件。沒有這個元件玩遊戲,就會有遊戲無法啟動這個程式的提示。想解決的使用者應該看看win7計算機中d3dx9_43.dl遺失的解決方案。 d3dx9_43.dll遺失在win7計算機中的解決方案。 1.從網路下載或複製d3dx9_43.dll檔案_43.dll檔案。將d3dx9_43.dll檔案儲存到系統中的System32目錄下;3.按Win+R開啟操作,輸入regsvr32d3

我們在使用安裝了win10作業系統的電腦時,有的情況下可能會遇到libcurl.dll元件遺失的情況。對於這種問題小編覺得我們可以在網路上下載一個這樣的元件,然後解壓縮安裝到我們的系統資料夾裡,重新啟動電腦即可。具體操作步驟就讓小編來告訴你怎麼做吧~希望可以幫助你。 win10電腦libcurl.dll遺失怎麼辦1、從其他相同系統的電腦的C:\Windows\SysWOW64(64位元win10)或C:\Windows\System32(32位元win10)錄影路徑複製libcurl.dll動態連結庫文

多數人都認為Ubuntu透過UbuntuSoftwareCenter徹底改革了dpkg套件管理。毫無疑問,以多數人標準來看,SoftwareCenter肯定是使用者友善的呢。但事實真是如此?本文將介紹Ubuntu軟體管理的現狀,伴隨著Ubuntu首次發布的軟體管理走了多遠,以及Ubuntu軟體領先的地方。一切從apt開始Ubuntu軟體管理的純粹形式使用apt打包工具,最先內置在很棒的但常被低估的Linux版本Debian中。可使用apt安裝、移除或更新Ubuntu上的軟體。若要完全清除軟體,可

在日常生活中,手機已經成為我們不可或缺的工具,我們儲存了大量的個人資訊和重要資料在手機上。因此,一旦手機遺失或被盜,不僅會造成經濟損失,還可能洩漏隱私資訊。而對於華為手機用戶來說,遺失手機後如何定位手機的具體位置成為一個迫切需要解決的問題。華為手機具有一系列智慧定位功能,用戶可以透過多種方式找回遺失的手機。首先,用戶可以利用華為提供的「查找手機」服務來定位

當電腦程式開啟時,系統提示不能啟動該程序,因為MSVCR110.dll遺失在電腦中,試圖重新安裝程式以解決這個問題。在win10計算機中遺失msvcr110.dll怎麼辦?由於現在所有的5.5環境都是基於vc11編譯腳本產生的,所以你必須在windows下安裝相關元件。讓我們和小編一起看看具體的方法。在win10電腦中遺失msvcr110.dll怎麼辦首先,開啟瀏覽器,在瀏覽器中下載相關程式。開啟後,在選擇語言中選擇簡體中文,然後點選右邊的下載按鈕。二、此時會彈出一個要我們下載的程式選

在mysql中,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影”行。所謂的幻讀,就是透過SELECT查詢出來的資料集並不是真實存在的資料集,使用者透過SELECT語句查詢某筆記錄是不存在的,但是它有可能在真實的表格中是存在的。
