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...