Spring學習(十):Spring事務管理—數據庫事務管理知識

一、數據庫事務

  • 原子性:表示組成一個事務的多個數據庫操作,是一個不可分割的原子單元,只有所有的操作執行成功 ,事務纔會提交
  • 一致性:事務操作成功後,數據庫所處的狀態和他的業務規則是一致的
  • 隔離性:在併發數據操作時,不同的事務擁有各自的操作空間
  • 持久性:事務提交成功後,數據庫的數據操作都必須持久化到數據庫中

數據的一致性是最終目標。

數據庫鎖:多個事務試圖對相同的數據進行操作時,只有持有鎖的事務纔可以操作數據

二、數據併發的問題:

1.髒讀:A事務讀取B事務尚未提交的更改數據,並在這個數據的基礎上進行操作。如果恰巧B事務回滾,那麼A事務讀取的數據根本是不會被承認的。

2.不可重複讀:

3.幻象讀:

幻象讀和不可重複讀是兩個 容易混淆的概念。

  • 幻象讀是讀取到了其他已經提交事物的新增數據(insert),添加表級鎖,將整張表鎖定,防止新增數據(Oracle使用多版本數據方式實現)
  • 不可重複讀是讀取到了其他已經提交事務的修改數據(update、delete)。添加行級鎖

4.第一類丟失更新

A事務撤銷時,把已經提交的B事務更新數據覆蓋了。

5.第二類丟失更新

A事務覆蓋B事務已經提交的數據,造成B事務所作操作丟失。

三、數據庫鎖機制

按鎖定的對象不同,一般可以分爲表級鎖行級鎖。從併發事務鎖定的關係看,可以分爲共享鎖定 和獨佔鎖定。

  • 共享鎖定會防止獨佔鎖定,但允許其他共享鎖定
  • 獨佔鎖定即防止其他獨佔鎖定,也防止共享鎖定

爲了修改數據,數據庫必須在被修改的行上施加行獨佔鎖定,insert、update、delete、select for update語句都會隱式採用必要的行鎖定。

Oracle數據庫五種常用的行鎖定:

  1. 行共享鎖定:通過select for update 語句隱式獲取,在Oracle中用戶可通過LOCK TABLE IN ROW SHARE MODE語句顯示獲得。行共享鎖定不防止對數據行進行修改操作,但是防止其他會話獲取獨佔性表鎖定。允許進行多個併發的行共享和 行獨佔鎖定
  2. 行獨佔鎖定:通過一條INSERT UPDATE 或DELETE隱式獲取,還可通過LOCK TABLE IN ROW EXCLUSIVE MODE顯式獲取。這種鎖定可防止其他會話獲取一個共享鎖定,共享行獨佔鎖定和獨佔鎖定
  3. 表共享鎖定:
  4. 表共享行獨佔鎖定:
  5. 表獨佔鎖定:

四、事務的隔離級別

數據庫事務隔離級別

隔離級別

 

髒讀 不可重複讀 幻象讀 第一類丟失更新 第二類丟失更新
READ UNCOMMITED 允許 允許 不允許 不允許 允許
READ COMMITED 不允許 允許 允許 不允許 允許
REPEATABLE READ 不允許 不允許 允許 不允許 不允許
SERIALIZABLE 不允許 不允許 不允許 不允許 不允許

數據庫的隔離級別和數據的併發性是對立的。

  • 使用READ UNCOMMITED 隔離級別的數據庫擁有最高的併發量和吞吐性
  • 使用SERIALIZABLE隔離級別的數據庫併發性最低
  • SQL 92推薦使用REPEATABLE READ以保證數據的讀一致性

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章