資料庫的併發問題以及資料庫的隔離級別

2021-04-29 15:09:18 字數 1263 閱讀 2572

什麼是資料庫的併發問題:

在同一時刻,多個事務進行同一資料記錄進行操作,導致的問題。

資料庫併發產生的五個問題:

1、髒讀:乙個事務讀到另一事務未提交的更新資料。

在a事務內,由於b事務對a記錄進行了修改但未提交,而a事務馬上讀取了這個提交的值,在這個值的基礎上進了一系列的操作,但另乙個事務突然出回滾,導致資料值不一致的問題。

2、虛讀:乙個事務讀到另一事務已提交的新插入的資料。

在a事務內,由於b事務對a表的插入操作並提交,導致在a事務中前後查詢得到關於整張表相關的值不一致的問題

3、不可重複讀:乙個事務讀到另一事務已提交的更新資料。

在a事務內,由於b事務對a記錄的修改並提交,導致在a事務中前後查詢得到同一記錄的值不一樣的問題。

4、第一類丟失更新:撤銷乙個事務時,把其他事務已提交的更新資料覆蓋。

在a事務內,讀取得到某一記錄的值,同時在b事務把同一記錄的值進行了修改並提交,a事務基於原來讀取到的值進行修改後回滾,在資料庫中得到丟失了b事務更新的結果。(這種問題在資料庫中基本不會出現)。

5、第二類丟失更新:這是不可重複讀中的特例,乙個事務覆蓋另一事務已提交的更新資料。

在a事務內,讀取得到某一記錄的值,同時在b事務把同一記錄的值進行了修改並提交,a事務基於原來讀取到的值進行修改後提交,在資料庫中得到丟失了b事務更新的結果。

為了解決以上的一些問題,每個資料庫都有隔離級別這樣乙個概念。

什麼是隔離級別:

在a事務內,我們可以對資料庫進行增/刪/改/查操作,在b事務內,我們也可以進行資料庫的增/刪/改/查操作,在a事務開啟時鎖定什麼,而僅充許b事務有什麼樣的操作。

有以下五種隔離級別:(在資料庫的四種隔離級別中都可以解決的乙個問題就是第一類丟失更新)

serializable:可以解決以上5個問題,使以上五個問題都不會出現。

repeatable read(可重複讀): 在乙個事務內進行多次資料查詢時,保證多次查詢的結果是一致的.

read commited(提交讀):在乙個事務中,發出的sql語句對資料進行了操作並提交後,其它事務才可以查詢到操作後的資料。

在髒讀這個問題中,a事務不可以讀取到b事務未提交的更改,所以可以解決髒讀的問題。對於虛讀/不可重複讀/第二類丟失更新的問題,由於b事務的操作已提交,所以a事務依然可以查詢到b事務所操作的資料,因此虛讀/不可重複讀/第二類丟失更新的問題不能解決。

read uncommited(未提交讀):在乙個事務中,只要發出了sql語句對資料進行了操作而未提交,其它事務均可馬上查詢到操作後的資料,所以這種隔離級別並不能解決其它四個問題。

資料庫的併發問題

a事務讀取了b事務尚未提交的更改資料,並且在這個資料基礎上進行操作。如果此時恰巧b事務進行回滾,那麼a事務讀到的資料是根本不被承認的。以下是乙個取款事務和轉賬事務併發時引起的髒讀場景。時間轉賬事務a 取款事務b t1開始事務 t2開始事務 t3查詢賬戶餘額為1000元 t4取出500元,把餘額改為5...

資料庫事務併發問題

乙個資料庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有採取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為 5類,包括 3類資料讀問題 髒讀 幻象讀和不可重複讀 以及 2類資料更新問題 第一類丟失更新和第二類...

資料庫高併發問題

多執行緒多程序 計算密集型任務 使用多程序,因為能python有gil,多程序可以利用上cpu多核優勢 io密集型任務 使用多執行緒,做io切換節省任務執行時間 併發 乙個專案剛開始的時候是為了實現基本功能,隨著版本和功能的迭代,大資料和高併發成了軟體設計必須考慮的問題 本質很簡單,乙個是慢,乙個是...