定義: 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted(未授權讀取、讀未提交)、read committed(授權讀取、讀提交)、repeatable read(可重複讀取)、serializable(序列化),這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。
問題的提出: 之所以提出事務隔離級別,是因為在乙個事務執行過程中,可能會出現以下幾種情況:1、更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。2、髒讀 乙個事務讀取到了另乙個事務未提交的資料操作結果。3、不可重複讀(non-repeatable reads):乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。 包括以下情況: (1) 虛讀:事務t1讀取某一資料後,事務t2對其做了修改,當事務t1再次讀該資料時得到與前一次不同的值。 (2) 幻讀(phantom reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢中出現的資料(這裡並不要求兩次查詢的sql語句相同)。這是因為在兩次查詢過程中有另外乙個事務插入資料造成的。
下面介紹一下這幾種事務隔離級別的區別以及可能出現的問題:
read uncommitted(未授權讀取、讀未提交):
如果乙個事務已經開始寫資料,則另外乙個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過「排他寫鎖」實現。
避免了更新丟失,卻可能出現髒讀。也就是說事務b讀取到了事務a未提交的資料。
read committed(授權讀取、讀提交):
讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。
該隔離級別避免了髒讀,但是卻可能出現不可重複讀。事務a事先讀取了資料,事務b緊接了更新了資料,並提交了事務,而事務a再次讀取該資料時,資料已經發生了改變。
repeatable read(可重複讀取):
讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
避免了不可重複讀取和髒讀,但是有時可能出現幻讀。這可以通過「共享讀鎖」和「排他寫鎖」實現。
serializable(序列化):
提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。
序列化是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。
隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
大多數資料庫的預設級別就是read committed,比如sql server , oracle。 mysql的預設隔離級別就是repeatable read。 參考資料:
資料庫事務四種隔離級別
定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...
資料庫事務四種隔離級別
定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...
資料庫事務四種隔離級別
定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...