Spring_數據庫事務、事務并發、數據庫鎖_01
01 何為數據庫事務
ACID
-
原子性(Atomic)
表示組成一個事務的數據庫操作是不可分割的原子單元,只有所有的操作執行成功,整個事務才提交,事務中任何一個數據庫操作失敗,已執行的任何操作都必須撤銷。
-
一致性(Consistency)
事務操作成功之后,數據庫所處的狀態和它的業務規則是一致的,即數據不會被破壞。
如從A賬戶操作轉賬100元到B賬戶,不管操作成功或者失敗,A和B的存款總額是不變的。 -
隔離性(Isolaction)
在并發數據操作時,不同的事務擁有各自的數據空間,他們各自的操作不會對對方產生干擾。
-
持久性(Durabiliy)
一旦事務提交成功之后,十五中所有的數據操作都必須持久化到數據庫中。
數據庫系統一般采用重執行日志保持原子性,一致性和持久性。
02 數據庫并發產生的問題
數據庫中的數據被多個事務同時訪問產生的5類問題。3類數據讀問題(臟讀、不可重復讀和幻象讀)以及兩類更新問題(第一類丟失問題和第二類丟失問題)
-
臟讀
- A事務讀取B事務未提交的更改數據,并在這個基礎上進行操作,如果恰巧B事務進行回滾,那么A事務讀取到的數據是不被承認的。
- 在Oracle數據庫中不會發生臟讀的情況。
-
不可重復讀
- A事務過程中讀取了B事務提交的數據。導致兩次讀取的結果不一致。
-
幻象讀
A事務讀取B事務提交的新增數據。幻象讀一般發生在統計事務中,統計事務兩次讀取統計的數據不一致。
幻象讀和不可重復讀是兩個容易混淆的概念,幻象讀是指讀到了其他已經提交事務的新增數據,而不可重復讀是指讀到了已經提交事務的更改數據(更改或刪除),為了避免這兩種情況,采用的對策是不同的,防止讀取到更改數據,只需要對操作的數據添加行級鎖,阻止操作過程中數據發生變化,而防止讀取到新增數據,則需要添加表級鎖。
- 第一類丟失更新
A事務撤銷時,把已經提交的B事務的更新數據給覆蓋了。 - 第二類丟失更新
A事務覆蓋到B事務已經提交的數據,造成B事務所做的操作丟失。
03 數據庫鎖機制
數據庫并發會引發很多問題,數據庫通過鎖機制解決并發訪問的問題,雖然不同的數據庫在實現細節上存在差別,但基本原理上都一致。
按鎖的對象不同,一般可以分為表級鎖和行級鎖。從并發事務鎖定的關系上看,可以分為共享鎖和獨占鎖,共享鎖會防止獨占鎖定,但允許其他的共享鎖定。而獨占鎖定即防止其他的獨占鎖定,也防止其他的共享鎖定。為了更改數據,數據庫必須在進行更改的行上施加行獨占鎖定,INSERT、UPDATE、DELETE和SELECT FOR UPDATE 語句都會隱式采用必要的行級鎖定。
-
行共享鎖定
- 一般通過select for update語句隱式獲得行共享鎖定。
- 行共享鎖定并不防止對數據行進行更改的操作,但是可以防止其他會話獲取獨占性數據表鎖定。
- 允許進行多個并發的行共享和行獨占鎖定,還允許進行數據表的共享或者采用共享行獨占鎖定。
-
行獨占鎖定
- 通過INSERT,UPDATE或DELETE語句隱式獲取。或者通過lock table in row exclusive mode語句顯式獲取。
- 這個鎖定可以防止其他會話獲取一個共享鎖定,共享行獨占鎖定或獨占鎖定。
-
表共享鎖定
- 通過 lock table in share mode語句顯式獲得。
- 可以防止其他會話獲取行獨占鎖定(Insert、UPDATE、DELETE)或其他表共享行獨占鎖定
- 或表獨占鎖定,允許在表中擁有多個行共享和表共享鎖定。
- 該鎖定可以讓會話具有對表事務級一致性訪問,因為其他會話在用戶提交或者回滾該事務并釋放對該表的鎖定之前不能更改這個被鎖定的表。
-
表共享行獨占
- 通過lock table in share row exclusive mode語句顯式獲得。
- 防止其他會話獲取一個表共享、行獨占或者表獨占鎖定。
- 允許其他行共享鎖定,這種鎖定類似于表共享鎖定,只是一次只能對一張表放置一個表共享行獨占鎖定。
- 如果A會話擁有該鎖定,則B會話可以執行select for update操作,
但B會話視圖更新選擇的行,則需要等待。
-
表獨占
- 通過lock table in exclusive mode顯式獲得。
- 防止其他會話對該表的任何其他操作。