mysql事務隔離級別測試

2021-10-08 21:23:34 字數 2510 閱讀 1015

1、髒讀

又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。

例如:事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因rollback了,那麼事務t2讀取的就是髒資料。

2、不可重複讀

同乙個事務中,多次讀出的同一資料是不一致的。

例如:事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

3、幻讀

例如:事務t1插入id為3的資料,事務t2,查詢不存在id為3的資料,然後t1進行了提交,事務2也執行插入id為3的,但是插入失敗了已經存在了,但是查詢是沒有了,就會造成幻讀.

注:三種問題看似不太好理解,髒讀側重的是資料的正確性。不可重複度側重的於對資料的修改,幻讀側重於資料的新增和刪除。

//建立資料庫

create database test;

//建立表

create table user (

id int(11

) not null primary key auto_increment,

name varchar(20

),age int default 0);

insert into `user` values (1,

'zhangsan',23

);insert into `user` values (2,

'lisi',20

);//查詢預設隔離級別

以後版本:

select @@transaction_isolation

;以前老版本:

show variables like 't%_isolation'

;//修改隔離級別為讀未提交

set global transaction isolation level read uncommitted;

// session1 開啟事務,進行一次次查詢,session2,開啟事務,執行:

update user set name=『aaaa』 where id = 1;

然後沒有,提交,session1再次查詢,發現讀到未提交的事務了,id為1的已經修改了,如圖:

//修改隔離級別為不可重複讀

set global transaction isolation level read committed ;

修改之後要斷開連線重新開啟session:

//查詢預設隔離級別

以後版本:

select @@transaction_isolation;

以前老版本:

show variables like 『t%_isolation』;

同上的操作,

// session1 開啟事務,進行一次次查詢,session2,開啟事務,執行update查詢:

update user set name=『aaaa』 where id = 1;

select * from user;

這時候已經解決了讀未提交;

然後將session2事務進行提交:

commit;

session繼續查詢,發現資料修改了,堵到了已經提交的資料:

session在同乙個事務中,執行同乙個查詢確出現不同的結果:就會造成不可重複讀;

如上的同樣的操作,將事務隔離級別設定為 repeatable read ,解決了不可重複讀;

set global transaction isolation level repeatable read;

update user set age=3 where id =1;

跟上面操作一樣的,但是會造成,幻讀:

就是如果,session1,開啟事務,session2開啟事務,然後session2插入乙個wangwu,session1查詢沒有id為3的,也插入個wangwu,這時候如果session2提交了事務那麼session1會插入失敗,如果session2還沒提交,session1會等待,session2的提交或者回滾,但是這時候session1是沒有查詢到的,就會造成幻讀:

insert intouservalues (3, 『wangwu』, 20);

serializable就沒什麼說的了,是給整個表加鎖,只有等另外事務執行完成,才能進行操作:

我在session1中開啟事務,執行插入id為3的操作,這時候session2去查詢user,會等待session1的事務完成…這種隔離級別基本不會用;

set global transaction isolation level serializable;

//查詢預設隔離級別

以後版本:

select @@transaction_isolation;

以前老版本:

show variables like 『t%_isolation』;

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

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

MySQL事務隔離級別

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

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...