1 設定隔離級別,包括 全域性@@global.tx_isolation, 會話級別@@session.tx_isolation
mysql workbench的會話
2 建立測試表
注意 unsigned auto_increment primary key用法 ,預設引擎的設定
#建立測試表
use test;
drop table if exists transaction_test;
create table transaction_test
id int unsigned not null auto_increment primary key
,val varchar(20) not null
,created timestamp not null default current_timestamp
) engine=innodb default charset latin1;
insert into transaction_test(val) values ('a'),('b'),('c');
3 測試 'read-uncommitted';
(1)開啟兩個會話
執行set @@session.tx_isolation='read-uncommitted';
(2)#會話1
start transaction;
update transaction_test set val='222' where id=1;
#select * from transaction_test;
select sleep(20);
rollback;
(3)#會話2
select * from transaction_test;
(4)# 先執行會話1 更新 但不提交, 在10秒內執行會話2 會話2會查詢到會話1更新但為提交的內容
4 測試read-committed
前一種情況修改為read-committed模式,會話2不會查詢到會話1更新但為提交的內容
(1)開啟兩個會話
執行set @@session.tx_isolation='read-committed';
(2)#會話1
start transaction;
select * from transaction_test;
select sleep(10);
select * from transaction_test;
commit;
(3)#會話2
start transaction;
update transaction_test set val='22' where id=1;
commit;
(4)# 先執行會話1 在10秒內執行會話2 會話1會查詢到會話2更新提交的內容,即不可重複讀的問題
5 測試repeatable-read
前一種情況修改為repeatable-read模式,會話2可以實時更新,但會話1的查詢是可重複讀的不會去讀取會話2的更新內容
6 測試serializable
設定事務a,b
set @@global.tx_isolation='serializable';
set @@session.tx_isolation='serializable';
事務astart transaction;
select * from transaction_test ;
事務binsert into transaction_test (val)values('i');#會進入阻塞,等待事務a釋放鎖
事務acommit;#執行後 事務b的插入語句 正常執行
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
Mysql隔離級別
先記錄下幾個概念 髒讀 在當前事務中,讀取到其他事務中還未提交的資料 不可重複讀 在當前事務中,讀取某一行的資料,可能讀出的資料不同 幻讀 在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。四種隔離級別 1.未提交讀 可能讀到髒資料 會話a中的隔離級別為未提交讀 表中原來的...
Mysql 隔離級別
此隔離級別中,事務的修改對其他的事務也是可見的,事務可以讀取未提交的資料,也稱為髒讀 dirty read 很少使用此級別。大多數資料庫系統預設使用該隔離級別 mysql不是 此隔離級別中事務從開始到提交資料之前,所有的操作對於其他事物都是不見的,也稱作不可重複讀 nonrepeatable 造成2...