mysql事务测试
1、打开mysql的命令行-将自动提交事务给关闭
``sql
--查看是否是自动提交 1表示开启-0表示关闭select @@autocommit;--设置关闭set autocommit = 0;
`
2、数据准备
`sql
--创建数据库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;
`
3、测试事务
`sql
--事务包含四个隔离级别:从上往下-隔离级别越来越高-意味着数据越来越安全read uncommitted; --读未提交read commited; --读已提交repeatable read; --可重复读(seariable) --序列化执行-串行执行--产生数据不一致的情况:脏读不可重复读幻读
`
隔离级别
异常情况
异常情况
读未提交
脏读
不可重复读
幻读
读已提交
不可重复读
幻读
可重复读
幻读
序列化
4、测试1:脏读 read uncommitted
`sql
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 psnB:select * from psn; --读取的结果msb。产生脏读-因为A事务并没有commit-读取到了不存在的数据A:commit;B:select * from psn; --读取的数据是msb,因为A事务已经commit-数据永久的被修改
`
5、测试2:当使用read committed的时候-就不会出现脏读的情况了-当时会出现不可重复读的问题
`sql
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的时候(按照上面的步骤操作)-就不会出现不可重复读的问题-但是会出现幻读的问题
`sql
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');--报错-无法插入数据--此时发现读取不到数据-但是在插入的时候不允许插入-出现了幻读-设置更高级别的隔离级别即可解决
``