MySQL 事務隔離

2021-08-26 02:17:04 字數 3119 閱讀 1980

未提交讀(read uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料

提交讀(read committed):只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 (不重複讀)

可重複讀(repeated

read):可重複讀。在同乙個事務內的查詢都是事務開始時刻一致的,innodb預設級別。在sql標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀

序列讀(serializable):完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞

innodb預設是可重複讀的(repeatable read)

my.inf檔案設定事務隔離級別:

ransaction-isolation

=

set transaction語句改變單個會話或者所有新建連線的隔離級別。它的語法如下:

set [session | global] transaction

isolation

level

查詢事務級別:

select @@global.tx_isolation;

select @@session.tx_isolation;

select @@tx_isolation;

預設的行為(不帶session和global)是為下乙個(未開始)事務設定隔離級別。如果你使用global關鍵字,語句在全域性對從那點開始建立的所有新連線(除了不存在的連線)設定預設事務級別。你需要super許可權來做這個。使用session

關鍵字為將來在當前連線上執行的事務設定預設事務級別。 任何客戶端都能自由改變會話隔離級別(甚至在事務的中間),或者為下乙個事務設定隔離級別。

髒讀: 是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。

事務1:修改資料name

start

transaction;

update tb_user set name = '456'

where id = 1;

#commit; #先不提交事務

事務2:查詢事務

start

transaction;

select * from tb_user where id = 1 ;

commit;

在select @@session.tx_isolation;,為read uncommitted時,允許髒讀,name為456。其他情況不允許髒讀查到的為修改前的資料。

不可重複讀:是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第乙個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。

事務1:事務級別』repeatable-read』。插入新資料

start

transaction;

select * from tb_user ; #先查詢資料

#執行事務2插入資料,不提交。

select * from tb_user ; #重複查詢

commit;

事務2:事務級別』read-committed』。插入新資料

start

transaction;

select * from tb_user ;

insert

into

`test`.`tb_user` (`name`, `age`,`create_time`) values ('打算', '1','2015-01-20 00:00:00');

select * from tb_user;

#commit; #不提交

結果:在事務2為提交讀的隔離級別下,事務1兩次查詢結果不一致。(即不可重複讀)

幻讀:第乙個事務對乙個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第乙個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣。(可以這樣理解。事務a進行了一些插入和更新操作(未提交),這時事務b並不知情,讀到的資料為事務a操作之前的資料,這時候事務b進行的插入和更新就可能造成錯誤。)

事務1

start

transaction;

select * from t_bitfly;

#事務2插入資料

select * from t_bitfly; #查不到事務2插入的資料

#事務2提交事務

select * from t_bitfly; #依舊查不到事務2插入的資料

insert

into t_bitfly values (1, 'a'); #插入出錯

select * from t_bitfly;

commit;

事務2

start

transaction;

insert

into t_bitfly values (1, 'a');

#commit; #先不提交

隔離級別

髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

未提交讀(read uncommitted)

可能可能

可能已提交讀(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能可序列化(serializable )

不可能不可能

不可能

mysql事務隔離最高 Mysql事務隔離級別

mysql官方文件顯示 innodb中每個隔離級別的詳細描述如下 read uncommitted select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為 髒讀 dirty read 另外,這個隔離級別象read commit...

Mysql 事務隔離

1 事務的特性 原子性 一致性 隔離性 永續性 2 多事務同時執行的時候,可能會出現的問題 髒讀 不可重複讀 幻讀 3 事務隔離級別 讀未提交 讀提交 可重複讀 序列化 4 不同事務隔離級別的區別 讀未提交 乙個事務還未提交,它所做的變更就可以被別的事務看到 讀提交 乙個事務提交之後,它所做的變更才...

MySQL事務隔離

髒讀 事務a更新了資料但是並未提交,事務b查詢到事務a更新的資料,事務a此時執行回滾操作,事務b讀到的資料是髒資料。不可重複讀 事務a多次讀取同一資料。事務b在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果不一樣。幻讀事務a多次讀取一組資料。事務b在事務a多次讀取的...