帶你走進EJB 事務併發問題

2021-06-19 11:19:30 字數 1768 閱讀 7264

在上篇文章我們提到

,當執行多個事務的時候

,並且這些事務方式資料庫中的相同資料會出現一系列的併發問題

,這些問題彙總起來總共有以下幾類.

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

髒讀:乙個事務讀到另乙個事務為提交的更新資料。

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

幻像讀:乙個事務讀到另乙個事務已提交的新插入的資料。

丟失更新

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

舉乙個小例子來幫助進一步理解

:當事務a和事務b同時修改資料庫表的某行的值,

1.事務a將數值改為1

0000

並提交

2.事務b將數值改為2

0000

並提交。這時資料的值為2

0000

,事務a所做的更新將會丟失。

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

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

1.甲的原工資為1000

0, 乙將甲的工資改為了

15000

,此時但未提交事務.

2.甲讀取自己的工資 ,發現自己的工資變為了

15000!

3.而乙發現操作有誤,回滾了事務,甲的工資又變為了1000

0像這樣,甲記取的工資數

15000是乙個髒資料。

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

非重複讀

當第二個事務多次訪問同一行而且每次讀取不同的資料時,會發生不一致的分析問題。不一致的分析與未確認的相關性類似,因為其它事務也是正在更改第二個事務正在讀取的資料。然而,在不一致的分析中,第二個事務讀取的資料是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次資訊都由其它事務更改;因而該行被非重複讀取。

在乙個事務中前後兩次讀取的結果並不致,導致了不可重複讀。

1.在事務1中,甲讀取了自己的工資為1000

0,操作並沒有完成

2.在事務2中,這時乙修改了甲的工資為

5000

0,並提交了事務.

3.在事務1中,甲再次讀取自己的工資時,工資變為了

50000

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

幻像讀     

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

目前工資為1000

0的員工有5人。

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

0的員工。

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

3.事務1再次讀取所有工資為1000

0的員工共讀取到了

6條記錄,

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

上面所產生的併發問題我們都基本上給出了解決的方案或者建議

,也就是用鎖

.鎖機制能有效地解決併發事務時的各種問題,但是也會影響到併發的效能。資料庫系統提供了相應的解決方案,.

事務的併發問題

1 髒讀 事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料 2 不可重複讀 事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。3 幻讀 系統管理員a將資料庫中所有學生的成績從具體分數改為abcde...

事務 鎖 併發 問題

sql server鎖型別 1 holdlock 在該錶上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所新增的鎖。2 nolock 不新增共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的資料或 髒資料 這個選項僅僅應用於select語句。3 paglock 指定新增頁鎖 否則通常可能...

事務 二 事務的併發問題

事務是併發操作的基本單位,保證事務acdi特性是事務處理的重要任務,而事務acdi特性遭到破壞的乙個直接原因就是是多個事務對資料庫 共享資源 的併發操作引起的,為了保證事務的隔離性與一致性。dbms必須對事物進行合理正確的排程。由於事物的併發操作可能導致事務之間進行交織操作,可能會出現資料不一致的問...