數據庫事務隔離級別
數據庫隔離級別:是在在數據庫操作中,為了有效保證並發讀取數據的正確性提出的。
隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免髒讀取,而且具有較好的並發性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新這些並發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。
數據庫的幾種隔離級別:
READ UNCOMMITTED(讀未提交數據):允許事務讀取未被其他事務提交的變更數據,會出現髒讀、不可重復讀和幻讀問題。
READ COMMITTED(讀已提交數據):只允許事務讀取已經被其他事務提交的變更數據,可避免髒讀,仍會出現不可重復讀和幻讀問題。
REPEATABLE READ(可重復讀):確保事務可以多次從一個字段中讀取相同的值,在此事務持續期間,禁止其他事務對此字段的更新,可以避免髒讀和不可重復讀,仍會出現幻讀問題。
SERIALIZABLE(序列化):確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入、更新和刪除操作,可避免所有並發問題,但性能非常低。
Oracle支持兩種事務隔離級別:
READ COMMITTED(默認事務隔離級別),SERIALIZABLE
MySQL支持四種事務隔離級別,其中REPEATABLE READ為默認事務隔離級別。
通過上面可以知道多事務同時運行,如果不采用以上四種隔離機制,可能會產生多個並發問題,其中包括髒讀、不可重復讀和幻讀,下面就解釋下這幾種並發問題:
存在兩個事物(T1,T2)同時運行
髒讀:T1讀取了已經被T2修改但還未提交的字段,由於某種原因,T2事物回滾,則T1讀取的內容是臨時且無效的。
不可重復讀:T1讀取一個字段,之後T2更新了該字段,T1在此讀取該字段值發生了變化。
幻讀:T1從一個表中讀取了一個字段,然後T2在該表中插入了一些新的行,之後T1在此讀取該表會多出幾行。