定义:
事务隔离级别介绍:多个连接开启各自的事务操作数据库中数据是,数据库系统要负责系统隔离操作,以确保各个连接在获取数据时的准确性
如果不考虑隔离性,可能会引发以下问题
- 脏读:当b事务读到了a事务尚未提交的修改,则产生脏读
- 不可重复读:同一查询在a事务中进行多次,由于其他提交事务所做的修改或者删除,每次返回不同的结果集,则发生不可重复读
- 幻读:当a事务提交事务后,在b事务内本不应该能读到a事务内的更改,若是读到了便是b产生幻读
实验理解隔离级别
1、以管理员方式打开两个控制台,成为表1和表2
2、两表都进入数据库
mysql -u root -p
3、查看两表的隔离级别
SELECT @@tx_isolation;
两表隔离级别默认可重复读
4、将表b的隔离级别更改成为READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
5、a、b两表启动事务
start transaction;
两个表都进入自己的库,我的数据库是tmp
use tmp
创建表
CREATE TABLE `account`(
id INT,
`name` VARCHAR(32),
money INT);
6、开始进行测试
对表A进行插入操作 insert into account values(100,'tom',1000);
查看b表 select *from account,发现b表中能查看到表a的插入,而a表尚未对该修改进行提交,这种情况便是脏读。
脏读:当b事务读到了a事务尚未提交的修改,则产生脏读
在a表中进行如下操作
update account set money = 800 where id=100;
insert into account values(200,'jack',2000);
commit;
在a表中进行多次插入操作,事务提交后,查看b表
可知,在a表提交事务后,b表也受到了a表的影响,进行相应的修改,这便是幻读
幻读:当a事务提交事务后,在b事务内本不应该能读到a事务内的更改,若是读到了便是b产生幻读
7、更改b的隔离级别(读以提交),继续测试
两表的事务都进行提交commit;
对b表进行修改级别,读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
两表开启事务
start transaction;
在a表中添加
insert into account values(300,'xjh',3000);
查看a表
查看b表
b中并没有该数据,证明b的级别(读已提交)并不会出现脏读
对a表进行修改并提交
update account set money =1800 where id=200;
commit;
查看b表,发现b表又读到a表增加的与修改的数据,即出现了不可重复读和幻读。
8、对b表级别修改成可重复读(REPEATABLE-READ)
老操作,两表都commit提交事务,然后更改b表级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
两表再重新进入事务START TRANSACTION;
在a表中插入数据
insert into account values(400,'wxy',6000);
update account set money =100 where id=300;
查看a,b表,发现a表的修改并未对b表又影响,即b为产生脏读现象
在a表中输入commit;提交a表,查看b表;
发现a提交之后,b表内容仍然为产生影响,即b表不会产生不可重复读和幻读现象;
9、对b表隔离级别进行修改,改成可串行化(SERIALIZABLE)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
对a表修改
insert into account values(500,'zjl',80000);
update account set money =900 where id=300;
此时a表并未进行提交操作,在b表进行查询操作
可以发现,b表卡在select *from account;最后会返回
原因是b表有锁,当a表对事务进行修改时,如果a表并未提交该操作,则b表无法打开。当a表commit提交该事务时,b表才可以查看该表。
本实验显示参照B站韩顺平MySQL 71集,72集
版权归原作者 西楚小王八 所有, 如有侵权,请联系我们删除。