Mysql 事務隔離性

2021-09-10 02:05:01 字數 2808 閱讀 2222

事務併發所引起的跟讀取資料有關的問題,各用一句話來描述一下:

1.髒讀:事務 a 讀取了事務 b 未提交的資料,並在這個基礎上又做了其他操作。(讀取未提交)

2.不可重複讀:事務 a 讀取了事務 b 已提交的更改資料。(讀取新提交update)

3.幻讀:事務 a 受到事務 b 已提交的新增資料影響。(看不到已提交更新,但是執行寫操作時受影響)

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 、read committed 、repeatable read 、serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。

髒讀不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

×隔離性測試:

設定生效範圍是當前事務 

mysql 5

select @@tx_isolation;

set tx_isolation='read-uncommitted';

mysql 8

select @@transaction_isolation;

set transaction_isolation='read-uncommitted';

事務第一次執行select之後會記錄快照,之後再執行select,只會讀取快照內容。其他事務commit任何改變資訊(insert,delete,update),對本事務不可見。會出現幻讀現象,但是不影響當前事務執行update,insert的正確性。

一定要注意update、insert、delete 條件能夠命中索引。否則將直接上表鎖。ab

說明select * fromn tb_pet;

select * fromn tb_pet;

a,b獲取到的資料記錄一致, 有資料(id,name,shl,ml) (3,「old」,1,500);

start transaction

-事務a開始 

-start transaction

事務開始

-insert

into tb_pet(id,name,shl,ml) values(6,「bull」,1,1000);

b插入資料,

上鎖(事務b未提交,其他事物需要等待事務b提交才能修改)

update 

tb_pet set name="new",shl=2

where id=3

b修改資料,

上鎖

select * from tb_pet;

select * from tb_pet;

a沒有獲取到b插入的資料,不產生髒讀,

a產生tb_pet快照

-commit;

事務b提交

select * from tb_pet;

結果:(3,「old」,1,500) -

a讀取不到b新增和更新的資料,可重複讀(此時事務a並未提交)

update 

tb_pet set name="first"

where id=3 and name="old" ; -

0行受影響。a看不到id=3的name已經被修改,產生幻讀

。但是系統中已經沒有符合條件的資料。

update 

tb_pet set shl=shl+1

where id=3 ; -

此時a以為結果數量會是2

select * from tb_pet where id=3;

結果:(3,「new」,3,500) -

產生幻讀

insert

into tb_pet(id,name,shl,ml) values(6,「bull」,1,1000);

-a插入失敗,報duplicate key錯誤(i是主鍵),產生幻讀,a查詢不到id=6的記錄,理論上可以插入該記錄,但事實上b已經插入了這條記錄,對於a來說幻讀了id=6的記錄

兩個mysql 客戶端a,b, 都設定為 "read-committed"隔離級別,a設定事務不自動提交,b設定為事務不自動提交。 a

b說明select * fromn tb_pet;

select * fromn tb_pet;

a,b獲取到的資料記錄一致

start transaction

-事務a開始 (事務a未提交)

-start transaction

事務開始(事務b未提交)

-insert into tb_pet values(5,「mouse」,1,500);

b插入資料(事務b未提交)

select * from tb_pet;

select * from tb_pet;

a沒有獲取到b插入的資料,不產生髒讀

-commit;

事務b提交

select * from tb_pet;

-a讀取到b新增的資料了,產生

不可重複讀(此時事務a並未提交)

補充:

1、事務隔離級別為讀已提交時,寫資料只會鎖住相應的行

2、事務隔離級別為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新資料時會鎖住整張表。乙個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。

3、事務隔離級別為序列化時,讀寫資料都會鎖住整張表

MySQL事務的隔離性

事務的特徵 acid 隔離級別 設定事務隔離級別 隔離級別的作用範圍 檢視事務隔離級別 事務的操作 隔離級別 髒讀不可重複讀 幻讀讀未提交 read uncommitted 可能可能 可能讀已提交 read committed 不可能可能 可能可重複讀 repeatable read 不可能不可能 ...

事務隔離性

事務a 讀取事務b更新的資料,然後事務b回滾,那麼a讀取到的資料就是髒資料 情景展示 1.會話b 可提交讀 set session transaction isolation level read uncommitted begin update account set balance balanc...

MySQL事務 隔離性中的隔離級別

建表 create table student id int primary key,name varchar 100 engine innodb charset utf8 測試資料 insert into student values 1 張三 如果乙個事務讀到了另乙個未提交事務修改過的資料,那麼...