1. 程式人生 > >事物隔離級別

事物隔離級別

未授權讀取

也稱為讀未提交(Read Uncommitted):允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫資料,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過“排他寫鎖”實現。

授權讀取

也稱為讀提交(Read Committed):允許不可重複讀取,但不允許髒讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。

可重複讀取(Repeatable Read)

可重複讀取(Repeatable Read):禁止不可重複讀取和髒讀取,但是有時可能出現幻影資料。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

序列化(Serializable)

序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能併發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為Read Committed。它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、虛讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖樂觀鎖

來控制。

3. 髒讀、不可重複讀、幻影讀

1 髒讀:當事務1修改了一條記錄,沒有提交時,事務2讀取了該記錄;當事務1回滾了,那麼事務2的記錄就是一條不存在的記錄; 2 不可重複讀:當事務1讀取了一條記錄,未提交事務,事務2修改了該條記錄並且提交事務;事務1又讀取了該條記錄,發現兩條記錄不一樣; 3 幻影讀:當事務1根據某種檢索條件讀取了若干條記錄,未提交事務;而事務2又插入了一條記錄,該記錄也符合事務1的檢索條件;那麼當事務1在根據相同查詢條件檢索資料時候,出現了不一致的現象。 根據鎖機制來避免上訴問題: 排他鎖:資料加鎖後,只有鎖的擁有者可以對該資料進行修改和讀取,其他使用者不能做任何操作,也不能加鎖 共享鎖:資料加鎖後,所有使用者都可以讀取該物件,但是不能修改之,其他使用者也可以加共享鎖 處理以上隔離級別的問題,採用如下方是: 1 處理髒讀:採用READ_COMMITTED,修改時加排他鎖,直到事務提交後才釋放,讀取時加共享鎖,讀取完釋放 事 務1讀取資料時加上共享鎖後(這樣在事務1讀取資料的過程中,其他事務就不會修改該資料),不允許任何事物操作該資料,只能讀取,之後1如果有更新操作, 那麼會轉換為排他鎖,其他事務更無權參與進來讀寫,這樣就防止了髒讀問題。但是當事務1讀取資料過程中,有可能其他事務也讀取了該資料,讀取完畢後共享鎖 釋放,此時事務1修改資料,修改完畢提交事務,其他事務再次讀取資料時候發現數據不一致,就會出現不可重複讀問題,所以這樣不能夠避免不可重複讀問題。 2 處理不可重複讀:讀採用RepeatableRead,取資料時加共享鎖,寫資料時加排他鎖,都是事務提交才釋放鎖。讀取時候不允許其他事物修改該資料,不管資料在事務過程中讀取多少次,資料都是一致的,避免了不可重複讀問題 3 處理幻影讀問題:用Serializable,採用的是範圍鎖RangeS RangeS_S模式,鎖定檢索範圍為只讀,這樣就避免了幻影讀問題