Spring事務_事務的隔離級別_02
事務的隔離級別
盡管數據庫為用戶提供了鎖的DML操作方式,但直接使用鎖管理是十分麻煩的,因此數據庫為用戶提供了自動鎖機制。
只要用戶指定會話的事務隔離級別,數據庫就會分析事務中的SQL語句,然后自動為事務操作的數據資源添加上合適的鎖。此外數據庫還會維護這些鎖,當一個資源上的鎖數據太多時,自動勁松鎖升級以提高系統的運行性能,而這一過程對用戶來說是完全透明的。
- ANSI/ISO SQL標準定義了4個等級的事務隔離級別,在相同的環境中,使用相同的輸入,執行相同的工作,根據不同的隔離級別,可以導致不同的結果。不同的事務隔離級別能夠解決的數據并發問題的能力是不同的。
隔離級別 | 臟讀 | 不可重復讀 | 幻象讀 | 第一類丟失更新 | 第二類丟失更新 |
---|---|---|---|---|---|
read uncommitted | 允許 | 允許 | 允許 | 不允許 | 允許 |
read committed | 不允許 | 允許 | 允許 | 不允許 | 允許 |
repeatable read | 不允許 | 不允許 | 允許 | 不允許 | 不允許 |
serializable | 不允許 | 不允許 | 不允許 | 不允許 | 不允許 |
事務的隔離級別和數據庫的并發性是對立的,兩者此增彼長,一般來說使用Read uncommited隔離級別的數據庫擁有最高的并發性和吞吐量,而使用Serializable事務隔離級別數據庫的并發和吞吐量最低。
SQL 92定義Read uncommited主要提供非阻塞讀的能力,Oracle雖然也支持Read uncommited級別的事務,但是它不支持臟讀,所以Oracle的Read Committed就滿足了SQL 92標準的repead read級別。
SQL 92推薦使用repeatable read來保證數據庫的對一致性。
總結
-
數據庫事務ACID
- 原子性 -要么成功,要么失敗 - 一致性 -數據庫的操作要和業務最終一致,A向B轉賬,不管成功或失敗,賬款總額不變 - 隔離性 -事務之間是獨立的,相互不影響 - 持久性 -事務一旦提交,所有的數據必須持久化到數據庫中
-
數據庫事務并發問題
五中問題(3中數據訪問問題2中更新問題) 1. 數據臟讀 -A事務讀取了B事務未提交的數據 2. 數據不可重復讀 -A事務中兩次讀取不一致 3. 數據幻象讀 -統計事務中,兩次統計過程新增數據 4. 第一種更新丟失 -A事務撤銷覆蓋了B事務的提交數據 5. 第二種更新丟失 -A事務提交覆蓋了B事務的更新數據
-
數據庫使用鎖機制解決數據并發問題
數據庫鎖機制解決數據并發問題 - 行級共享鎖 -不阻止事務更新但是禁止表獨占鎖 - 行級獨占鎖 -防止其他事務獲得共享鎖定,共享獨占鎖定或者獨占鎖定 - 表共享鎖定 - 防止其他事務表共享行獨占鎖或表獨占鎖定,允許在表中擁有多個行共享 - 和表共享鎖定,該鎖定可以讓會話具有表事務級一致性訪問。 - 表共享行獨占 - 防止其他會話獲得表共享、行獨占、或者表獨占鎖定。允許其他行共享 - 定.只是一個表一次只能放置一個表共享行鎖定。 - 表獨占 - 防止其他任何會話鎖定
-
由于數據庫鎖機制比較麻煩,數據庫提供隔離事務級別自動分析SQL添加鎖
事務級別 read uncommitted - 允許:臟讀、不可重復讀、幻象讀、第二種更新丟失 - 不允許:第一種更新丟失 read committed - 允許:不可重復讀,幻象讀,第二種更新丟失 - 不允許:臟讀,第一種更新丟失 repetable read - 允許:幻象讀 - 不允許:臟讀、不可重復讀、第一種更新丟失、第二種更新丟失 serializable - 不允許:臟讀、不可重復讀、幻象讀、第一種更新丟失、第二種更新丟失
不是所有的數據庫都支持事務,即支持事務的數據庫也并非支持所有的事務隔離級別,可以通過JDBC的Connection.getMetaData()方法獲取DataBaseMetaDate對象,并通過該對象的supportTransctaions().supportsTransactionIsolationLevel(int level)方法查看地城數據庫的支持情況。