資料庫的併發問題

2021-08-28 06:35:13 字數 2566 閱讀 9468

a事務讀取了b事務尚未提交的更改資料,並且在這個資料基礎上進行操作。如果此時恰巧b事務進行回滾,那麼a事務讀到的資料是根本不被承認的。

以下是乙個取款事務和轉賬事務併發時引起的髒讀場景。

時間轉賬事務a

取款事務b

t1開始事務

t2開始事務

t3查詢賬戶餘額為1000元

t4取出500元,把餘額改為500元

t5查詢賬戶餘額為500元(髒讀)

t6撤銷事務,餘額恢復為1000元

t7匯入100元,餘額改為600元

t8提交事務

在這個場景中,b希望取款500元,而後有撤銷了動作,而a往同乙個賬戶轉賬100元,因為a事務讀取了b事務尚未提交的資料,因而導致了賬戶白白丟失了500元。在oracle資料中,不會發生髒讀的情況。

不可重複讀是指a事務讀取了b事務已經提交的更改資料。假設a在取款事務的過程中,b往該賬戶轉賬100元,a兩次讀取賬戶的餘額發生不一致

時間取款事務a

轉賬事務b

t1開始事務

t2開始事務

t3查詢賬戶餘額為1000元

t4查詢賬戶餘額為1000元

t5取出100元,把餘額改為900元

t6提交事務

t7查詢賬戶餘額為900元

在同乙個事務中t4和t7時間點讀取的賬戶存款餘額不一致

a事務讀取b提交的新增資料,這時a事務將出現幻想讀的問題。幻讀一般發生在計算統計資料的事務中。舉個例子,假設銀行系統在同乙個事務中兩次統計存款的總金額,在兩次統計過程中,剛好新增了乙個存款賬戶,並存入100元,這時兩次統計的總金額將不一致。

時間統計金額事務a

轉賬事務b

t1開始事務

t2開始事務

t3統計存款總金額為10000元

t4新增乙個存款賬戶,存款為100元

t5提交事務

t6再次統計存款總金額為10100元(幻象讀)

如果新增的資料剛好滿足事務的查詢條件,那麼這個新資料就會進入事務的視野,因而導致兩次統計結果不一致的情況。

幻讀和不可重複讀是兩個容易混淆的概念,前者是指讀到了其他事物已經提交的新增資料,而後者是讀到了已經提交事務的更改資料(更改或刪除)。為了避免這兩種情況,採取的策略是不同的:防止讀到更改資料,只需對操作的資料新增行級鎖,阻止操作過程中的資料傳送變化,而防止讀到新增資料,則往往需要新增乙個表級鎖–將整張表鎖定,防止新增資料(oracle使用多版本資料的方式實現)

a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯可能會造成很嚴重的問題。通過下面的賬號取款轉賬就可以看出來。

時間取款事務a

轉賬事務b

t1開始事務

t2開始事務

t3查詢賬號餘額為1000元

t4查詢餘額為1000元

t5匯入100元,把餘額改為1100元

t6提交事務

t7取出100元,把餘額改為900元

t8撤銷事務

t9餘額恢復為1000元(丟失更新)

a事務在撤銷時,「不小心」將b事務已經轉入賬號的金額給抹去了。

a事務覆蓋b事務已經提交的資料,造成b事務所操作丟失。

時間轉賬事務a

取款事務b

t1開始事務

t2開始事務

t3查詢賬號餘額為1000元

t4查詢餘額為1000元

t5取出100元,把餘額改為900元

t6提交事務

t7匯入100元,把餘額改為1100元

t8提交事務

t9把餘額改為1100元(丟失更新)

在上面的例子,由於支票轉賬事務覆蓋了取款事務對存款餘額所做的更新,導致銀行最後損失了100元,相反如果轉賬事務先提交,那麼使用者損失了100元。

insert, update, delete, select for update 語句會隱式採用必要的鎖定。

1.行共享鎖: select for update 語句隱式獲取行共享鎖

2.行獨佔鎖: insert,update,delete 語句隱式獲取,或者通過lock table in row exclusive mode 獲取行獨佔鎖

3.表共享鎖: lock table in share mode 獲取,防止其他獨佔鎖獲取,但是允許在表內擁有多個行共享鎖和表共享鎖

4.表共享行獨佔鎖:lock table in share row exclusive mode 獲取

5.表獨佔鎖 : lock table in exclusive mode不能被spring aop 事務增強的方法

動態**策略

不能被事務增強的方法

基於介面的動態**(jdk)

除了public方法均不能,此外public static 也不能增強

cglib 動態**

private,static ,final 方法

對於private方法,由於最終會被public方法封裝後再開放給外部呼叫者,而public方法是可以事務增強的,所以基本沒有什麼問題。在實際開發中,最容易造成隱患的基於cglib**的 public static 和 public final 方法。原因是它們本身是public的,因此可以直接被外部呼叫,只要呼叫方沒有事務上下文,這些方法就會以無事務的方式執行。

資料庫事務併發問題

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

資料庫高併發問題

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

資料庫事務併發問題

多個事務同時訪問資料庫時候,會發生下列5類問題,包括3類資料讀問題 髒讀,不可重複讀,幻讀 2類資料更新問題 第一類丟失更新,第二類丟失更新 1,髒讀 dirty read a事務讀取b事務尚未提交的更改資料,並在這個資料基礎上操作。如果b事務回滾,那麼a事務讀到的資料根本不是合法的,稱為髒讀。在o...