資料庫的讀現象

2021-07-13 02:23:58 字數 2344 閱讀 9533

「讀現象」是多個事務併發執行時,在讀取資料方面可能碰到的狀況。先了解它們有助於理解各隔離級別的含義。其中包括髒讀、不可重複讀和幻讀。

資料庫帶來的併發問題包括:

當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。第二個事務正在讀取的資料還沒有確認並且可能由更新此行的事務所更改。

舉例1:e.g.

mary的原工資為1000, 財務人員將mary的工資改為了8000(但未提交事務)

mary讀取自己的工資 ,發現自己的工資變為了8000,歡天喜地!

而財務發現操作有誤,回滾了事務,mary的工資又變為了1000

像這樣,mary記取的工資數8000是乙個髒資料。

解決辦法:如果在第乙個事務提交前,任何其他事務不可讀取其修改過的值,則可 以避免該問題。

舉例2:又如:

在這個例子中,事務2回滾後就沒有id是1,age是21的資料了。所以,事務一讀到了一條髒資料。

不可重複讀,是指在資料庫訪問中,乙個事務範圍內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改的提交而引起的。比如事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

一種更易理解的說法是:在乙個事務內,多次讀同乙個資料。在這個事務還沒有結束時,另乙個事務也訪問該同一資料。那麼,在第乙個事務的兩次讀資料之間。由於第二個事務的修改,那麼第乙個事務讀到的資料可能不一樣,這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀,即原始讀取不可重複。

**舉例1:**e.g.

在事務1中,mary 讀取了自己的工資為1000,操作並沒有完成

在事務2中,這時財務人員修改了mary的工資為2000,並提交了事務.

在事務1中,mary 再次讀取自己的工資時,工資變為了2000

解決辦法:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。

又如:舉例說明2:

在基於鎖的併發控制中「不可重複讀(non-repeatable read)」現象發生在當執行select 操作時沒有獲得讀鎖(read locks)或者select操作執行完後馬上釋放了讀鎖; 多版本併發控制中當沒有要求乙個提交衝突的事務回滾也會發生「不可重複讀(non-repeatable read)」現象。

在這個例子中,事務2提交成功,因此他對id為1的行的修改就對其他事務可見了。但是事務1在此前已經從這行讀到了另外乙個「age」的值。

例子1:

當對某行執行插入或刪除操作,而該行屬於某個事務正在讀取的行的範圍時,會發生幻像讀問題。事務第一次讀的行範圍顯示出其中一行已不復存在於第二次讀或後續讀中,因為該行已被其它事務刪除。同樣,由於其它事務的插入操作,事務的第二次或後續讀顯示有一行已不存在於原始讀中。

舉例1:e.g. 目前工資為1000的員工有10人。

1. 事務1,讀取所有工資為1000的員工。

2. 這時事務2向employee表插入了一條員工記錄,工資也為1000

3. 事務1再次讀取所有工資為1000的員工 共讀取到了11條記錄,

解決辦法:如果在操作事務完成資料處理之前,任何其他事務都不可以新增新資料,則可避免該問題

例子2:

當事務1兩次執行select … where檢索一定範圍內資料的操作中間,事務2在這個表中建立了(如insert)了一行新資料,這條新資料正好滿足事務1的「where」子句。

在這個例子中,事務一執行了兩次相同的查詢操作。但是兩次操作中間事務二向資料庫中增加了一條符合事務一的查詢條件的資料,導致幻讀。

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。  

e.g.

事務a和事務b同時修改某行的值

事務a將數值改為1並提交

事務b將數值改為2並提交。

這時資料的值為2,事務a所做的更新將會丟失。

解決辦法:對行加鎖,只允許併發乙個更新事務。

資料庫讀現象

資料庫管理軟體的 讀現象 指的是當多個事務併發執行時,在讀取資料方面可能碰到的問題,包括又髒讀,不可重複讀和幻讀.ps 對於一些資料庫軟體會自帶相應的機制去解決髒讀,不可重複讀,幻讀等問題,因為這些自帶的機制,下述的一些實驗可能在某一資料庫管理軟體 的預設機制下並不成立,即我們並不能在所有資料庫管理...

資料庫系統之幻影讀現象專案練習

關於幻影讀現象的介紹可以看我的這篇文章 在pl sql中實現兩個處理資料庫的stored procedures並通過這兩個stored procedures觸發乙個幻影現象。要模擬資料庫事務的併發處理,請使用標準pl sql包dbms lock中的pl sql procedure sleep。使用s...

資料庫避免髒讀,幻讀

一 髒讀 乙個事務讀取到了另外乙個事務沒有提交的資料 詳細解釋 髒讀就是指 當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外乙個事務讀到的這個資料是髒資料,依據髒資料所做的操作...