數據庫事務的隔離級別有4個,由低到高依次爲Read uncommitted(未受權讀取、讀未提交)、Read committed(受權讀取、讀提交)、Repeatable read(可重複讀取)、Serializable(序列化),這四個級別能夠逐個解決髒讀、不可重複讀、幻象讀這幾類問題。數據庫
- Read uncommitted(未受權讀取、讀未提交):
若是一個事務已經開始寫數據,則另一個事務則不容許同時進行寫操做,但容許其餘事務讀此行數據。該隔離級別能夠經過「排他寫鎖」實現。這樣就避免了更新丟失,卻可能出現髒讀。也就是說事務B讀取到了事務A未提交的數據。
- Read committed(受權讀取、讀提交):
讀取數據的事務容許其餘事務繼續訪問該行數據,可是未提交的寫事務將會禁止其餘事務訪問該行。該隔離級別避免了髒讀,可是卻可能出現不可重複讀。事務A事先讀取了數據,事務B緊接了更新了數據,並提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。
- Repeatable read(可重複讀取):
可重複讀是指在一個事務內,屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,即便第二個事務對數據進行修改,第一個事務兩次讀到的的數據是同樣的。這樣就發生了在一個事務內兩次讀到的數據是同樣的,所以稱爲是可重複讀。讀取數據的事務將會禁止寫事務(但容許讀事務),寫事務則禁止任何其餘事務。這樣避免了不可重複讀取和髒讀,可是有時可能出現幻象讀。(讀取數據的事務)這能夠經過「共享讀鎖」和「排他寫鎖」實現。
- Serializable(序列化):
提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,但不能併發執行。若是僅僅經過「行級鎖」是沒法實現事務序列化的,必須經過其餘機制保證新插入的數據不會被剛執行查詢操做的事務訪問到。序列化是最高的事務隔離級別,同時代價也花費最高,性能很低,通常不多使用,在該級別下,事務順序執行,不只能夠避免髒讀、不可重複讀,還避免了幻像讀。
隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲Read Committed。它可以避免髒讀取,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。大多數數據庫的默認級別就是Read committed,好比Sql Server , Oracle。MySQL的默認隔離級別就是Repeatable read