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