交易的隔離等級
在資料庫操作中,為了有效保證並發讀取資料的正確性,提出的事務隔離等級。
推薦:《mysql教學》
問題的提出
資料庫是要被廣大客戶所共享存取的,那麼在資料庫操作過程中很可能會出現以下幾種不確定情況。
更新遺失
兩個事務都同時更新一行數據,一個事務對數據的更新覆蓋了另一個事務對數據的更新。這是因為系統沒有執行任何的鎖定操作,因此並發事務並沒有被隔離。
髒讀
一個交易讀取到了另一個交易未提交的資料操作結果。這是相當危險的,因為很可能所有的操作都被回滾。
無法重複讀取
無法重複讀取(Non-repeatable Reads):一個交易對同一行資料重複讀取兩次,但是卻得到了不同的結果。
包括以下情況:
(1) 虛讀:事務T1讀取某一資料後,事務T2對其做了修改,當事務T1再次讀該數據時得到與前一次不同的值。
(2) 幻讀(Phantom Reads):交易在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或缺少了第一次查詢中出現的資料(這裡並沒有要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入資料所造成的。
解決方案
為了避免上面出現的幾種情況,在標準SQL規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同。
未授權讀取
也稱為讀取未提交(Read Uncommitted):允許髒讀取,但不允許更新遺失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫入操作,但允許其他事務讀取此行數據。此隔離等級可以透過「排他寫鎖」來實現。
授權讀取
也稱為讀取提交(Read Committed):允許無法重複讀取,但不允許髒讀取。這可以透過「瞬間共享讀鎖」和「排他寫鎖」來實現。讀取資料的事務允許其他事務繼續存取該行數據,但是未提交的寫入事務將會禁止其他事務存取該行。
可重複讀取(Repeatable Read)
可重複讀取(Repeatable Read):禁止不可重複讀取和髒讀取,但有時可能出現幻讀資料。這可以透過「共享讀鎖」和「排他寫鎖」來實現。讀取資料的事務將會禁止寫入事務(但允許讀取事務),寫事務則禁止任何其他事務。
序列化(Serializable)
序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個執行,不能並發執行。僅透過「行級鎖」是無法實現事務序列化的,必須透過其他機制保證新插入的資料不會被剛執行查詢操作的事務存取。
隔離等級越高,越能保證資料的完整性和一致性,但是對並發效能的影響也越大。對於多數應用程序,可以優先考慮將資料庫系統的隔離等級設為Read Committed。它能夠避免髒讀取,而且具有較好的並發性能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些並發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
更多程式相關內容,請關注php中文網程式入門欄位!
以上是事務的隔離等級詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!