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 事務開始前和...