MySQL的事務隔離級別

2021-09-29 07:23:05 字數 1484 閱讀 3696

隔離性是當多個使用者併發訪問資料庫時(比如操作同一張表),資料庫為每乙個使用者開啟乙個事務,且各事務之間互不干擾。

髒讀:事務a讀取了事務b中尚未提交的資料,如果事務b回滾了,則a讀取使用了錯誤的資料。

不可重複讀:在事務a的兩次讀資料之間,由於事務b的修改導致事務a兩次讀到的資料可能是不一樣的。這就發生了在乙個事務內兩次讀到的資料不一樣,這就被稱作不可重複讀;

幻讀:指乙個事務a對乙個表中的資料進行了修改,而且該修改涉及到表中所有的資料行;同時另乙個事務b是向表中插入一行新資料。那麼經過這一番操作之後,操作事務a的使用者就會發現表中還有沒修改的資料行,就像發生了幻覺一樣。這就被稱作幻讀。

級別高低:髒讀 < 不可重複讀 < 幻讀

幻讀和不可重複讀的區別:

不可重複讀是針對記錄的update操作,只要在記錄上加鎖就可以避免;幻讀是對記錄的insert操作,想要禁止幻讀就必須加上全域性的寫鎖(在表上加寫鎖)。

回滾丟失:事務a和b同時操作乙個資料,事務b已經提交了,然後a事務回滾了,這樣事務b的操作就因事務a回滾而丟失了;通過設定隔離級別repeatable read可以防止 。

覆蓋丟失:a事務覆蓋b事務已經提交的資料,造成b事務所做操作丟失。

我們對丟失更新問題建議採取在更新提交時做一次查詢確認在更新提交,我個人覺得都是樂觀的做法,區別在於悲觀鎖方法是通過select…for update方式,這個可能會導致其他會話的阻塞,而樂觀鎖方法需要多乙個版本列的維護,參考鏈結

mysql中,innodb所提供的事務復合acid要求,而事務通過事務日誌中的redo log和undo log滿足了原子性,一致性和永續性;隔離性是通過鎖機制來滿足的

使用 show variables like 『%isolation%』; 檢視隔離級別:

讀未提交(read uncommited),就是可以讀取別的事務未提交的資料,會出現髒讀,不可重複讀,幻讀的問題。

讀提交(read commited),寫加鎖,讀加鎖

會出現不可重複讀,幻讀的問題。

可重複讀(read repeatable),資料庫預設隔離級別,寫加鎖,讀加鎖 。

解釋:事務a對錶中的某條資料進行了修改,不管事務a是否提交,在事務b提交之前,這條資料對於事務b來說一直都是沒有發生改變的,這條資料在事務b中是可以重複的被讀取到,所以這種隔離級別稱之為「可重複讀」。

乙個事務讀的時候,我們把2次讀看成整體,在讀的過程中,不允許寫的操作,這樣就可以禁止不可重複讀。就是2次讀操作不允許其他事務操作。存在幻讀的問題。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...