事務的隔離級別
小結今天就來認識一下mysql的事務。
事務是邏輯上的一組操作,要麼都執行,要麼都不執行。
事務的特性(acid)
併發事務帶來的問題:
在應用程式中,通常會發生多個事務併發執行,多個使用者對統一資料進行操作,則可能導致以下問題:
例如:事務t1讀取a=10,事務t2也讀取a=10,t1進行a+1操作,t2也進行a+1操作,這時最終結果a=21。事務t1的修改丟失。
那麼幻讀和不可重複讀有什麼區別呢?
不可重複讀的重點是修改,幻讀的重點在於新增或者刪除。
舉個例子:
栗子1:事務t1中的大佬先生讀取自己的工資為10000的操作還沒完成,事務t2中的小菜菇涼就修改了大佬先生的工資為20000,導致大佬先生再讀自己的工資時工資變成了20000,啊!好高興啊,但是這就是不可重複讀。
(同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了。)
栗子2:這時工資表中工資大於5000的有4人,事務t1讀取了所有的工資大於5000的人,共查到4條記錄。這時事務t2又插入了一條工資大於5000的資料,然後事務t1再次讀取時查到的記錄就變成了5條記錄,這樣就導致了幻讀。
(同樣的條件,第1次和第2次讀出來的記錄數不一樣)
為了解決以上問題,接下來介紹一下事務的隔離級別:
mysql中的四個隔離級別
在mysql中定義了四個隔離級別:
▪ read-uncommitted(讀未提交):最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。
▪ read-committed(讀已提交):允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生。
▪ repeatable-read(可重複讀):對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
▪ serializable(可序列化):最高的隔離級別,完全服從acid的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。
注意:oracle中只有兩個隔離級別,分別為read-uncommitted(讀未提交)和read-committed(讀已提交),預設隔離級別為read-committed(讀已提交)。sql server與oracle同。
常用命令
mysql innodb儲存引擎的預設支援的隔離級別是repeatable-read(可重複讀)。
我們可以通過select @@tx_isolation;
命令來檢視,mysql 8.0將該命令改為select @@transaction_isolation;
set [session|global] transaction isolation level [read uncommitted|read committed|repeatable read|serializable]
常用的一些併發控制語句
黑色背景
不斷的總結,不斷的實踐。
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 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...