一、數據庫事務
- 原子性:表示組成一個事務的多個數據庫操作,是一個不可分割的原子單元,只有所有的操作執行成功 ,事務纔會提交
- 一致性:事務操作成功後,數據庫所處的狀態和他的業務規則是一致的
- 隔離性:在併發數據操作時,不同的事務擁有各自的操作空間
- 持久性:事務提交成功後,數據庫的數據操作都必須持久化到數據庫中
數據的一致性是最終目標。
數據庫鎖:多個事務試圖對相同的數據進行操作時,只有持有鎖的事務纔可以操作數據
二、數據併發的問題:
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數據庫五種常用的行鎖定:
- 行共享鎖定:通過select for update 語句隱式獲取,在Oracle中用戶可通過LOCK TABLE IN ROW SHARE MODE語句顯示獲得。行共享鎖定不防止對數據行進行修改操作,但是防止其他會話獲取獨佔性表鎖定。允許進行多個併發的行共享和 行獨佔鎖定
- 行獨佔鎖定:通過一條INSERT UPDATE 或DELETE隱式獲取,還可通過LOCK TABLE IN ROW EXCLUSIVE MODE顯式獲取。這種鎖定可防止其他會話獲取一個共享鎖定,共享行獨佔鎖定和獨佔鎖定
- 表共享鎖定:
- 表共享行獨佔鎖定:
- 表獨佔鎖定:
四、事務的隔離級別
隔離級別
|
髒讀 | 不可重複讀 | 幻象讀 | 第一類丟失更新 | 第二類丟失更新 |
READ UNCOMMITED | 允許 | 允許 | 不允許 | 不允許 | 允許 |
READ COMMITED | 不允許 | 允許 | 允許 | 不允許 | 允許 |
REPEATABLE READ | 不允許 | 不允許 | 允許 | 不允許 | 不允許 |
SERIALIZABLE | 不允許 | 不允許 | 不允許 | 不允許 | 不允許 |
數據庫的隔離級別和數據的併發性是對立的。
- 使用READ UNCOMMITED 隔離級別的數據庫擁有最高的併發量和吞吐性
- 使用SERIALIZABLE隔離級別的數據庫併發性最低
- SQL 92推薦使用REPEATABLE READ以保證數據的讀一致性