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