1.打开win+R,输入cmd,输入mysql -uroot -p回车,输入密码。关闭自动提交事务。
--查看是否是自动提交 1表示开启,0表示关闭 select @@autocommit; --设置关闭 set autocommit = 0;
2.数据准备
--创建数据库 create database tran; --切换数据库 两个窗口都执行 use tran; --准备数据 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;
这个我们开两个会话窗口进行测试。分别为a、b两个窗口。
3.测试1: read uncommitted(读未提交)
--a: set session transaction isolation level read uncommitted; --b: set session transaction isolation level read uncommitted;
--a: --开始事务 start transaction; select * from psn; update psn set name='zhaoliu'; selecet * from psn --b: start transaction; select * from psn;
b读取的结果zhaoliu。产生脏读,因为a事务没有commit,读取到了不存在的数据
--a: --提交事务 commit; --b: select * from psn;
b读取的数据是zhaoliu,因为a事务已经commit,数据永久的被修改。
4.测试2:read committed
--a: set session transaction isolation level read committed; start transaction; select * from psn; --b: set session transaction isolation level read committed; start transaction; select * from psn;
执行到这里两个窗口的数据是一致的。
--a: update psn set name ='tianqi' where id = 1; select * from psn; --b: select * from psn;
执行到此处两个窗口的数据不一致,b窗口中读取不到更新的数据
--a: commit; select * from psn; --b: select * from psn;
5.测试3:repeatable read
--a: set session transaction isolation level repeatable read; start transaction; select * from psn; --b: set session transaction isolation level repeatable read; start transaction; select * from psn; --此时两个窗口的数据是一致的 --a: insert into psn values(4,'zhouba'); commit; select * from psn; --b: select * from psn; --读取不到添加的数据 insert into psn values(4,'zhouba'); --报错,无法插入数据 --此时发现读取不到数据,但是在插入的时候不允许插入,出现了幻读,设置更高级别的隔离级别即可解决
6.测试事务
--事务包含四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全 read uncommitted; --读未提交 read commited; --读已提交 repeatable read; --可重复读 serializable --序列化执行,串行执行 /* 产生数据不一致的情况: 脏读 不可重复读 幻读 */
四种隔离级别会造成的异常情况:
隔离级别 | 异常情况 | 异常情况 | 异常情况 |
---|---|---|---|
读未提交 | 脏读 | 不可重复读 | 幻读 |
读已提交 | 不可重复读 | 幻读 | |
可重复读 | 幻读 | ||
序列化 |