Mysql隔离级别
- 读未提交(Read Uncommitted):能够读取到其他事务中未提交的内容,存在脏读问题。
- 读已提交(Read Committed RC):只能读取其他事务已经提交的内容,存在不可重复读问题。
- 可重复读(Repeated Read RR):在读取某行后不允许其他事务操作此行,直到事务结束,但是依然存在幻读问题。
- 串行化(Serializable):一个事务的开始必须等待另一个事务的完成。
下面只演示前三个出现的问题。
建表
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
age INT,
PRIMARY KEY(id)
);
插入数据
INSERT INTO student VALUE(1,'小张',10);
INSERT INTO student VALUE(2,'小丽',10);
INSERT INTO student VALUE(3,'图图',10);
修改隔离级别
下面是修改为Read Uncommitted的例子:
set session transaction isolation level read uncommitted;
脏读
打开两个CMD窗口,分别用于两个事务的操作
首先第一个事务输入
begin;
insert into student value(4,'熊二',15);
(注意此时第一个事务还没结束)
然后第二个事务直接输入
select * from student;
此时第二个事务已经结束(没有使用begin等操作),而且查找结果为
紧接着我们对第一个事务窗口输入
rollback;
此时第一个事务结束,而且(4,‘熊二’,15)的数据并没有插入成功。
结果是第二个事务读到了第一个事务刚刚提交失败的数据。
不可重复读
第一个事务输入
begin;
insert into student value(4,'熊二',15);
第二个事务输入
begin;
select * from student;
结果为
接着第一个事务输入
rollback;
此时第一个事务结束,第二个事务再输入
select * from student;
得到的结果为
问题就在于第二个事务发现数据库一致性出现问题,即在同一个事务中,连续查出的student表结果不相同。
幻读
此时表的数据为
首先第二个事务输入
begin;
select* from student;
所得结果和上面的图一样
第一个事务输入
insert into student value(5,'翠花',13);
第二个事务再输入
select* from student;
所得结果为
我们发现事务二没有出现幻读的情况。(其实是因为mysql在一定程度上解决了幻读问题)
那么是否真的没有幻读?
第二个事务输入
update student set age=20;
commit;
我们发现事务二操作了5行,但对于事务二来说不应该只有4吗?
最后我们查看一下student表
发现事务一插入的翠花的age从13变成了20。
结尾
以上就是所有演示了,如有问题或错误请留言。