MySQL的事務隔離級別

2021-09-02 13:42:05 字數 993 閱讀 7956

問題背景:前幾天在專案中遇到 兩個程序 query mysql資料不一致的情況,現象是程序a在insert 後,程序b select 不出來。後來發現 a b 都是用了事務,b中設定了autocommit = 0 表示手動提交事務。

sql標準規定了以下四種隔離級別。

假如有a b 兩個事務;

一、read uncommitted (讀未提交)

最低的事務隔離級別,,在事務b未commit前,a事務就能查詢到b事務中的對資料的變化。這種級別下,可能會導致髒讀(dirty reads)。

二、read committed(讀已提交)

在事務b commit後,事務a才能看到b 提交的資料。但是事務a中查詢兩次,可能兩次的記錄是不一樣的。也就是不可以重複讀。

三、repeatable reads(可重複讀)

通過一定的鎖機制,事務a 在過程中查詢到的資料都是一致的。這個是mysql的預設隔離級別。也就是說在b已經插入新資料並且commit後,在a事務中是體現不出來的。

但是可能會產生幻讀。也就是說這種級別下沒有加範圍鎖,其他事務部能更改a所選的事務,但是可以增加新的資料。

四、serializable,可序列化

這是最高的事務隔離級別,通過對讀取和更新的記錄加鎖,使多個事務序列工作。避免了上述碰到的各種髒讀等問題。但是是以效能為代價的。

注:在資料庫中執行下邊**可以檢視對於的事務級別。

select @@tx_isolation;
需要注意的是,操作具體表時還需要看錶的引擎,比如myisam 是不支援事務的,而innodb是支援事務的。也就是說不管你的事務隔離機制如何, myisam 型別的表都可以立即查詢到已經真       實儲存在資料庫中的記錄。也就是說只有支援事務的引擎才會受上邊事務隔離級別的影響。

名詞解釋:

髒讀:乙個事務a可以看到另乙個事務b未提交的內容。由於事務b未commit。所以資料後續可能會被rollback。在rollback後,a讀取到的資料就稱之為髒資料。

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 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...