這篇文章主要介紹“數據庫事務的概念和四大特性以及隔離級別”,在日常操作中,相信很多人在數據庫事務的概念和四大特性以及隔離級別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”數據庫事務的概念和四大特性以及隔離級別”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
事務指的是滿足 ACID 特性的一系列操作。在數據庫中,可以通過 Commit提交一個事務,也可以使用 Rollback 進行回滾。
1.原子性(Atomicity):事務被視為不可分割的最小單元,要么全部提交成功,要么全部失敗回滾。2.一致性(Consistency):事務執行前后都保持一致性狀態。在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。3.隔離性(Isolation):一個事務所做的修改在最終提交以前,對其它事務是不可見的。4.持久性(Durability):一旦事務提交,則其所做的修改將會永遠保存到數據庫中。即使系統發生崩潰,事務執行的結果也不能丟失??梢酝ㄟ^數據庫備份和恢復來保證持久性。
在了解完數據庫的四大特性之后,我們來討論一下數據庫的隔離級別的問題。在此之前,我們考慮在沒有數據庫隔離性的情況下,多用戶并發操作可能會發生的問題。
在并發環境下,一個事務如果受到另一個事務的影響,那么事務操作就無法滿足一致性條件。
1.丟失修改:多個事務同時讀取某一數據,一個事務成功處理好了數據,被另一個事務寫回原值,造成第一個事務更新丟失。例如,T1 和 T2 兩個事務都對一個數據進行修改,T1 先修改,T2 隨后修改,T2 的修改覆蓋了 T1 的修改。2.臟讀:臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。例如,T1 修改一個數據,T2 隨后讀取這個數據。如果 T1 撤銷了這次修改,那么 T2 讀取的數據是臟數據。3.不可重復讀:不可重復讀是指在對于數據庫的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值。這是由于在查詢間隔,被另一個事務修改并提交了。例如,T2 讀取一個數據,T1 對該數據做了修改。如果 T2 再次讀取這個數據,此時讀取的結果和和第一次讀取的結果不同。4.幻讀(虛讀):幻讀是事務非獨立執行時發生的一種現象。例如,T1 讀取某個范圍的數據,T2在這個范圍內插入新的數據,T1再次讀取這個范圍的數據,此時讀取的結果和和第一次讀取的結果不同。
產生并發不一致性問題主要原因是破壞了事務的隔離性,解決方法是通過并發控制來保證隔離性。并發控制可以通過封鎖來實現,但是封鎖操作都要用戶自己控制,相當復雜。數據庫管理系統提供了事務的隔離級別,讓用戶以一種更輕松的方式處理并發一致性問題。
現在我們來看下事務的四種隔離級別。
1.未提交讀(READ UNCOMMITTED):事務中的修改,即使沒有提交,對其它事務也是可見的。最低級別,任何情況都無法保證。2.提交讀(READ COMMITTED):一個事務只能讀取已經提交的事務所做的修改。換句話說,一個事務所做的修改在提交之前對其它事務是不可見的??杀苊馀K讀的發生。3.可重復讀(REPEATABLE READ):保證在同一個事務中多次讀取同樣數據的結果是一樣的??杀苊馀K讀、不可重復讀的發生。4.可串行化(SERIALIXABLE):強制事務串行執行??杀苊馀K讀、不可重復讀、幻讀的發生。
四種隔離級別的對比
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
未提交讀 | YES | YES | YES |
提交讀 | NO | YES | YES |
可重復讀 | NO | NO | YES |
可串行化 | NO | NO | NO |
以上四種隔離級別最高的是SERIALIXABLE(可串行化)級別,最低的是READUNCOMMITTED(未提交讀)級別,當然級別越高,執行效率就越低。像SERIALIXABLE(可串行化)這樣的級別, 就是以鎖表的方式使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。
在MySQL數據庫中,支持上面四種隔離級別,默認的為REPEATABLE READ(可重復讀);而在Oracle數據庫中,只支持SERIALIXABLE(串行化)級別和READCOMMITTED(讀已提交)這兩種級別 ,其中默認的為READ COMMITTED級別。
到此,關于“數據庫事務的概念和四大特性以及隔離級別”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。