Spring事務(wù)_02_事務(wù)的隔離級(jí)別

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é)

  1. 數(shù)據(jù)庫(kù)事務(wù)ACID

     - 原子性  -要么成功,要么失敗
     - 一致性  -數(shù)據(jù)庫(kù)的操作要和業(yè)務(wù)最終一致,A向B轉(zhuǎn)賬,不管成功或失敗,賬款總額不變
     - 隔離性  -事務(wù)之間是獨(dú)立的,相互不影響
     - 持久性  -事務(wù)一旦提交,所有的數(shù)據(jù)必須持久化到數(shù)據(jù)庫(kù)中
    
  2. 數(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ù)
    
  3. 數(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ì)話鎖定
    
  4. 由于數(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ù)的支持情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容