Mysql事務 髒讀,可重複讀,幻讀 測試

2021-10-09 00:12:50 字數 2437 閱讀 1889

1、開啟mysql的命令列,將自動提交事務給關閉

--檢視是否是自動提交 1表示開啟,0表示關閉

select @@autocommit;

--設定關閉

set autocommit = 0;

2、資料準備

--建立資料庫

create database tran;

--切換資料庫 兩個視窗都執行

use tran;

--準備資料

create table psn(id int primary key,name varchar(10)) engine=innodb;

--插入資料

insert into psn values(1,'zhangsan');

insert into psn values(2,'lisi');

insert into psn values(3,'wangwu');

commit;

3、測試事務

--事務包含四個隔離級別:從上往下,隔離級別越來越高,意味著資料越來越安全

read uncommitted; --讀未提交

read commited; --讀已提交

repeatable read; --可重複讀

(seariable) --序列化執行,序列執行

--產生資料不一致的情況:

髒讀不可重複讀

幻讀

隔離級別

異常情況

異常情況

讀未提交

髒讀不可重複讀

幻讀讀已提交

不可重複讀

幻讀可重複讀

幻讀序列化

4、測試1:髒讀 read uncommitted

set session transaction isolation level read uncommitted;

a:start transaction;

a:select * from psn;

b:start transaction;

b:select * from psn;

a:update psn set name='msb';

a:select * from psn

b:select * from psn;  --讀取的結果msb。產生髒讀,因為a事務並沒有commit,讀取到了不存在的資料

a:commit;

b:select * from psn; --讀取的資料是msb,因為a事務已經commit,資料永久的被修改

5、測試2:當使用read committed的時候,就不會出現髒讀的情況了,當時會出現不可重複讀的問題

set session transaction isolation level read committed;

a:start transaction;

a:select * from psn;

b:start transaction;

b:select * from psn;

--執行到此處的時候發現,兩個視窗讀取的資料是一致的

a:update psn set name ='zhangsan' where id = 1;

a:select * from psn;

b:select * from psn;

--執行到此處發現兩個視窗讀取的資料不一致,b視窗中讀取不到更新的資料

a:commit;

a:select * from psn;--讀取到更新的資料

b:select * from psn;--也讀取到更新的資料

--發現同乙個事務中多次讀取資料出現不一致的情況

6、測試3:當使用repeatable read的時候(按照上面的步驟操作),就不會出現不可重複讀的問題,但是會出現幻讀的問題

set session transaction isolation level repeatable read;

a:start transaction;

a:select * from psn;

b:start transaction;

b:select * from psn;

--此時兩個視窗讀取的資料是一致的

a:insert into psn values(4,'sisi');

a:commit;

a:select * from psn;--讀取到新增的資料

b:select * from psn;--讀取不到新增的資料

b:insert into psn values(4,'sisi');--報錯,無法插入資料

--此時發現讀取不到資料,但是在插入的時候不允許插入,出現了幻讀,設定更高階別的隔離級別即可解決

事務 髒讀 不可重複讀 幻讀

建立db8資料庫 create database db8 使用db8資料庫 use db8 建立賬戶表 create table account id int primary keyauto increment 賬戶id name varchar 20 賬戶名稱 money double 賬戶餘額 ...

髒讀 幻讀 不可重複讀和可重複讀

github 髒讀 幻讀 不可重複讀和可重複讀 即acid 隔離級別 髒讀 dirty read 不可重複讀 nonrepeatable read 幻讀 phantom read 未提交讀 read uncommitted 可能可能 可能已提交讀 read committed 不可能可能 可能可重複...

3 3 mysql 髒讀,幻讀,重複讀

一 基本概念 1 髒讀 事務a修改了某條資料,然後事務b讀取了事務a修改的該條資料,然後事務a由於某些原因,事務a回滾了,這樣事務b讀到的資料就和回滾的資料不同了,這時事務b讀取的資料就是髒資料。乙個事務讀取了另乙個事務未提交的資料。2 幻讀 事務a按一定條件讀取了該錶的一些資料,然後事務b向該錶插...