mysql事務的隔離級別與測試

2021-10-24 15:23:55 字數 3045 閱讀 4387

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

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

select @@autocommit

;--設定關閉

set autocommit =

0;

2、資料準備

--建立資料庫

create

database

tran

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

usetran

;--準備資料

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=

'zhaoliu'

;a:selecet *

from psn

b:select

*from psn;

--讀取的結果zhaoliu。產生髒讀,因為a事務並沒有commit,讀取到了不存在的資料

a:commit

;b:select

*from psn;

--讀取的資料是zhaoliu,因為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');

--報錯,無法插入資料

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

總結:

​ 現在學習的是資料庫級別的事務,需要掌握的就是事務的隔離級別和產生的資料不一致的情況

後續還有宣告式事務及事務的傳播特性以及分布式事務等有關事務的知識需要學習

mysql事務隔離級別測試

1 髒讀 又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。例如 事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因rollback了,那麼事務t2讀取的就是髒資料。2 不可重複讀 同乙個事務中,多次讀出的同一資料是不一致的。...

MySql事務與隔離級別

事務是由一組sql語句組成的邏輯處理單元,是滿足 acid 特性的一組操作,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。事務具有以下4個屬性,通常簡稱為事務的acid屬性 事務b讀取到了事務a已修改但尚未提交的的資料,還在這個資料基礎上做了操作。此時,如果a事務回滾...

Mysql事務與隔離級別

1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事務開始前和...