數(shù)據(jù)庫事務隔離的四個級別

數(shù)據(jù)庫隔離級別是在數(shù)據(jù)庫操作中,為了有效保證并發(fā)讀取數(shù)據(jù)的正確性提出的。

隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大。對于多數(shù)應用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新這些并發(fā)問題,在可能出現(xiàn)這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。

數(shù)據(jù)庫的幾種隔離級別:

READ UNCOMMITTED(讀未提交數(shù)據(jù)): 允許事務讀取未被其他事務提交的變更數(shù)據(jù),會出現(xiàn)臟讀、不可重復讀和幻讀問題。

READ COMMITTED(讀已提交數(shù)據(jù)): 只允許事務讀取已經(jīng)被其他事務提交的變更數(shù)據(jù),可避免臟讀,仍會出現(xiàn)不可重復讀和幻讀問題。

REPEATABLE READ(可重復讀): 確保事務可以多次從一個字段中讀取相同的值,在此事務持續(xù)期間,禁止其他事務對此字段的更新,可以避免臟讀和不可重復讀,仍會出現(xiàn)幻讀問題。

SERIALIZABLE(序列化): 確保事務可以從一個表中讀取相同的行,在這個事務持續(xù)期間,禁止其他事務對該表執(zhí)行插入、更新和刪除操作,可避免所有并發(fā)問題,但性能非常低。

Oracle支持兩種事務隔離級別:
READ COMMITTED(默認事務隔離級別),SERIALIZABLE
MySQL支持四種事務隔離級別,其中REPEATABLE READ為默認事務隔離級別。

通過上面可以知道多事務同時運行,如果不采用以上四種隔離機制,可能會產(chǎn)生多個并發(fā)問題,其中包括臟讀、不可重復讀和幻讀,下面就解釋下這幾種并發(fā)問題:

存在兩個事務(T1,T2)同時運行

臟讀: T1讀取了已經(jīng)被T2修改但還未提交的字段,由于某種原因,T2事務回滾,則T1讀取的內(nèi)容是臨時且無效的。
不可重復讀:T1讀取一個字段,之后T2更新了該字段,T1在此讀取該字段值發(fā)生了變化。在可重復讀中,該sql第一次讀取到數(shù)據(jù)后,就將這些數(shù)據(jù)加鎖(悲觀鎖),其它事務無法修改這些數(shù)據(jù),就可以實現(xiàn)可重復讀了。但這種方法卻無法鎖住insert的數(shù)據(jù),所以當事務A先前讀取了數(shù)據(jù),或者修改了全部數(shù)據(jù),事務B還是可以insert數(shù)據(jù)提交,這時事務A就會發(fā)現(xiàn)莫名其妙多了一條之前沒有的數(shù)據(jù),這就是幻讀,不能通過行鎖來避免。
幻讀: T1從一個表中讀取了一個字段,然后T2在該表中插入了一些新的行,之后T1在此讀取該表會多出幾行。讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這么做可以有效的避免幻讀、不可重復讀、臟讀等問題,但會極大的降低數(shù)據(jù)庫的并發(fā)能力。

數(shù)據(jù)庫事務的特性:原子性、一致性、隔離性、持久性

原子性: 事務的原子性指的是,事務中包含的程序作為數(shù)據(jù)庫的邏輯工作單位,它所做的對數(shù)據(jù)修改操作要么全部執(zhí)行,要么完全不執(zhí)行,這種特性稱為原子性。(簡單地說就是,幾個對于數(shù)據(jù)庫的操作要么全執(zhí)行,要么全不執(zhí)行,即同時成功起作用或同時失敗沒影響)

一致性:事務一致性值得是在一個事務執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)(中途是否一致不用管),這種特性稱為一致性。(如果數(shù)據(jù)庫的狀態(tài)滿足所有的完整性約束,就說該數(shù)據(jù)庫是一致的。一致性處理數(shù)據(jù)庫中對所有語義的保護。如:客戶K1要向客戶K2轉(zhuǎn)賬,K1賬戶減少的金額就是K2賬戶增加的金額,在轉(zhuǎn)賬之前K1和K2賬戶的金額之和與轉(zhuǎn)賬之后K1和K2賬戶的金額之和是一樣的,在轉(zhuǎn)賬期間可能不滿足這種一致性,但事務前后是數(shù)據(jù)庫數(shù)據(jù)是一致的)

隔離性: 隔離性指的是并發(fā)的事務是相互隔離的。(一個事務內(nèi)部的操作及正在操作的數(shù)據(jù)必須封裝起來,不被其它企圖進行修改的事務看到)

持久性: 持久性指當系統(tǒng)或介質(zhì)發(fā)生故障時,確保已提交的更新不能丟失。(一個事務提交,DBMS保證它對數(shù)據(jù)庫中數(shù)據(jù)的改變應該是永久性的,可以經(jīng)受任何系統(tǒng)故障,持久性通過數(shù)據(jù)庫備份和恢復來保證)





————————————————
版權聲明:本文為CSDN博主「燦爛小八戒」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/A1174316452/article/details/109442748

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

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

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