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';
事务A
start transaction;
select * from transaction_test ;
事务B
insert into transaction_test (val)values('i');#会进入阻塞,等待事务A释放锁
事务A
commit;#执行后 事务B的插入语句 正常执行