資料庫交易隔離等級:1、Read Uncommitted(讀取未提交);2、Read Committed(讀取已提交);3、Repeatable Read(可重複讀取);4、Serializable(可串列化)。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
在資料庫操作中,一項交易(Transaction)是由一條或多條操作資料庫的 SQL 語句組成的一個不可分割的工作單元,這些操作要么都完成,要么都取消。
資料庫事務隔離等級
在實際應用中,資料庫中的資料是要被多個使用者共同存取的,在多個當使用者同時操作相同的資料時,可能就會出現一些事務的並發問題,具體如下。
1)髒讀
指一個交易讀取到另一個交易未提交的資料。
2)不可重複讀取
指一個交易對同一行資料重複讀取兩次,但得到的結果不同。
3)虛讀/幻讀
指一個交易執行兩次查詢,但第二次查詢的結果包含了第一次查詢中未出現的資料。
4)遺失更新
指兩個事務同時更新一行數據,後提交(或撤銷)的事務將先前事務提交的資料覆蓋了。
遺失更新可分為兩類,分別是第一類遺失更新和第二類遺失更新。
第一類遺失更新是指兩個交易同時操作同一個資料時,當第一個交易撤銷時,把已經提交的第二個交易的更新資料覆蓋了,第二個事務就造成了資料遺失。
第二類遺失更新是指當兩個交易同時操作同一個資料時,第一個交易將修改結果成功提交後,對第二個交易已經提交的修改結果進行了覆蓋,對第二個事務造成了資料遺失。
為了避免上述交易並發問題的出現,在標準的 SQL 規範中定義了四種交易隔離級別,不同的隔離級別對交易的處理有所不同。這四種事務的隔離等級如下。
1)Read Uncommitted(讀未提交)
一個交易在執行過程中,既可以存取其他交易未提交的新插入的數據,又可以訪問未提交的修改資料。如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫入操作,但允許其他事務讀取此行數據。此隔離等級可防止遺失更新。
2)Read Committed(讀已提交)
一個交易在執行過程中,既可以存取其他交易成功提交的新插入的數據,又可以訪問成功修改的數據。讀取資料的事務允許其他事務繼續存取該行數據,但是未提交的寫入事務將會禁止其他事務存取該行。此隔離等級可有效防止髒讀。
3)Repeatable Read(可重複讀取)
一個事務在執行過程中,可以存取其他事務成功提交的新插入的數據,但不可以存取成功修改的資料。讀取資料的事務將會禁止寫入事務(但允許讀取事務),寫事務則禁止任何其他事務。此隔離等級可有效防止不可重複讀取和髒讀。
4)Serializable(可串行化)
提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個執行,不能並發執行。此隔離等級可有效防止髒讀、不可重複讀取和幻讀。但這個等級可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。
一般來說,交易的隔離等級越高,越能保證資料庫的完整性和一致性,但相對來說,隔離等級越高,對並發效能的影響也越大。因此,通常將資料庫的隔離等級設為 Read Committed,即讀已提交數據,它既能防止髒讀,又能有較好的並發效能。雖然這種隔離等級會導致不可重複讀取、幻讀和第二類遺失更新這些並發問題,但可透過在應用程式中採用悲觀鎖和樂觀鎖加以控制。
相關免費學習推薦:mysql影片教學
#以上是資料庫事務隔離等級有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!