MySql 的事務隔離級別

2021-07-25 16:57:42 字數 3199 閱讀 2955

首先建立乙個表account。建立表的過程略過。表的結構如下:

然後往表中插入兩條資料,插入後結果如下:

定義兩個事務:a使用者 和 b使用者。

a 執行如下操作:

set

session

transaction

isolation

level

read uncommitted;

start

transaction;

select * from

account;

隨後我們在a中查詢資料,結果如下:

b執行如下操作:

set

session

transaction

isolation

level

read uncommitted;

start

transaction;

update

account

setaccount=account+200

where

id = 1;

最後a使用者查詢結果:

那麼這麼做存在什麼問題呢?

那就是我們在乙個事務中可以隨隨便便讀取到其他事務未提交的資料,這還是比較麻煩的,我們叫髒讀。我不知道這個名字是怎麼起的,為了增強大家的印象,可以這麼想,這個事務好輕浮啊,飢渴到連別人沒提交的東西都等不及,真髒,呸!

實際上我們的資料改變了嗎?

答案是否定的,因為只有事務commit後才會更新到資料庫。

同樣的辦法,我們將使用者b所在的會話當前事務隔離級別設定為read commited。

在使用者a所在的會話中我們執行下面操作:

我們將id=1的使用者account減200。然後查詢,發現id=1的使用者account變為800。

在b使用者所在的會話中查詢:

select * from account;
結果如下:

我們會發現資料並沒有變,還是1000。

接著在會話a中我們將事務提交:

commit;
在會話b中查詢結果如下:

那麼這麼做有什麼問題嗎?

那就是我們在會話b同乙個事務中,讀取到兩次不同的結果。這就造成了不可重複讀,就是兩次讀取的結果不同。這種現象叫不可重複讀

現在有個需求,就是老闆說在同乙個事務中查詢結果必須保持一致,如果你是資料庫,你會怎麼做?資料庫是這麼做的。

在會話b中我們當前事務隔離級別為repeatable read。具體操作如下:

set

session

transaction

isolation

level repeatable read;

start

transaction;

接著在會話b中查詢資料:

我們在a使用者所在會話中為表account新增一條資料:

insert

into

account(id,account) value(3,1000);

commit;

然後我們查詢看資料插入是否成功:

回到b使用者所在的會話,我們查詢結果:

使用者b在他所在的會話中想插入一條新資料id=3,value=1000。來我們操作下:

什麼?竟然插不進去,說我資料重複?

使用者b當然不服啊,因為查詢到資料只有兩條啊,為什麼插入id=3說我資料重複了呢?

我再看一遍,莫非我眼花了?

試想一下,在實際中使用者a和使用者b肯定是相互隔離的,彼此不知道操作什麼。使用者b碰到這種現象,肯定會炸毛的啊,明明不存在的資料,插入卻說主鍵id=3資料重複了。

管他呢,老闆的要求滿足了。要乙個事務中讀取的資料一致(可重複讀)。我只能這麼做啊,打腫臉裝胖子。資料已經發生改變,但是我還是要保持一致。但是,出現了使用者b面對的問題,這種現象叫幻讀(記得當時就在這個地方糾結好久,到底什麼是幻讀啊)。

同樣,我們將使用者b所在的會話的事務隔離級別設定為serializable並開啟事務。

set

session

transaction

isolation

level

serializable;

start

transaction;

結果如下:

讀沒有問題,那我們在使用者a所在的會話中寫資料呢?

如果在等待期間我們使用者b所在的會話事務提交,那麼使用者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 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...