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=
'msb'
;a:selecet *
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');
--報錯,無法插入資料
--此時發現讀取不到資料,但是在插入的時候不允許插入,出現了幻讀,設定更高階別的隔離級別即可解決
總結:
現在學習的是資料庫級別的事務,需要掌握的就是事務的隔離級別和產生的資料不一致的情況
後續會學習宣告式事務及事務的傳播特性以及分布式事務
mysql事務隔離級別測試
1 髒讀 又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。例如 事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因rollback了,那麼事務t2讀取的就是髒資料。2 不可重複讀 同乙個事務中,多次讀出的同一資料是不一致的。...
mysql 事務 數量 Mysql 事務
什麼是事務 不可分割的操作,比如乙個事務要修改 a 表和刪除 b 表的資料兩個操作,這兩個操作都成功,這個事務才 commit,不然 rollback 每條 sql 語句都是乙個事務 只對 dml 生效 caid 一致性 consistency 讓資料保持一定程度的合理性,比如使用者加入購物車,購物...
Mysql 5 5 53 事務與併發測試
1.在事務中使用查詢遇上併發的情況 1 執行緒1事務開啟,執行緒2查詢資料 原始資料 tea name bbb 執行緒1 start transaction 執行緒1 select from t a tea where tea id 1 執行緒2 select from t a tea where ...