六、事务-5.事务隔离级别

一、概念

六、事务-5.事务隔离级别_第1张图片

从上至下,隔离级别越来越高,数据越来越安全,性能越来越低。

  • 读未提交read uncommitted —— 隔离级别最低(数据安全性最差),性能最好
  • 串行化serializable  ——隔离级别最高,性能最差

——一般采取MySQL的默认隔离级别,不会修改。

MySQL默认的隔离级别:可重复读 repeated read

Oracle默认的隔离级别:读已提交 read committed

二、语句

1、查看事务隔离级别

select @@transaction_isolation;

@@  :查看当前系统的变量信息

2、设置事务隔离级别

set  [ session | global ] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}

session: 会话级别,针对当前客户端窗口有效

glonal:针对所有客户端窗口有效

3、演示

六、事务-5.事务隔离级别_第2张图片

三、隔离级别 解决 事务并发问题

两个命令行模拟两个客户端并发操作。

登录MySQL并进入itheima数据库:

六、事务-5.事务隔离级别_第3张图片

1、脏读——只会出现在read uncommitted的隔离级别下

1)左侧设置隔离级别为read uncommitted,并查看accout表中的数据

六、事务-5.事务隔离级别_第4张图片

2)开启事务,左侧select操作,右侧update操作(未提交)

六、事务-5.事务隔离级别_第5张图片

3)左侧再次select操作,张三-1000(读取到右侧未提交的数据:脏读)

六、事务-5.事务隔离级别_第6张图片

4)右侧commit提交,左侧再select查询操作,数据依旧张三-1000,左侧也提交

六、事务-5.事务隔离级别_第7张图片

2、脏读——read committed不会出现脏读问题

1)左侧设置隔离级别为read committed

六、事务-5.事务隔离级别_第8张图片

2) 左右都开启事务,左侧select,右侧update(未提交)

六、事务-5.事务隔离级别_第9张图片

3)左侧再select,张三不会-1000,因为右侧update未提交

read committed隔离级别,不会出现脏读

六、事务-5.事务隔离级别_第10张图片

4)右侧commit,左侧再select ,张三会生效-1000,因为右侧update已提交

六、事务-5.事务隔离级别_第11张图片

3、不可重复读——read committed会出现不可重复读问题

1)左右同时开启事务,左侧select,右侧update

六、事务-5.事务隔离级别_第12张图片

2)左侧再select,张三应为0,因为右侧没提交(read committed不会出现脏读,没提交就读不到)

六、事务-5.事务隔离级别_第13张图片

3)右侧commit提交,左侧select,可以查到张三为1000,因为右侧update已提交

六、事务-5.事务隔离级别_第14张图片

4)在左侧命令行中,同一select命令执行三次,第三次的结果和前两次不一致——不可重复读问题

六、事务-5.事务隔离级别_第15张图片

4、不可重复读——repeatable read不会出现不可重复读问题

1)左侧设置隔离级别为repeatable read,左右都开启事务

六、事务-5.事务隔离级别_第16张图片

2)左侧select,右侧update并直接提交

六、事务-5.事务隔离级别_第17张图片

3)左侧再select,查询结果张三仍是1000,不受右侧的影响(同一个SQL语句结果相同)——可重复读

六、事务-5.事务隔离级别_第18张图片

4)左侧commit提交,再select,张三数据才会更新为2000

六、事务-5.事务隔离级别_第19张图片

5、幻读——repeatable read会出现幻读问题

1)左右都开启事务,左侧select查询id为3的数据(无id为3的数据)

六、事务-5.事务隔离级别_第20张图片

2)右侧insert插入id为3的数据,并直接提交(此时account表中有id为3的数据)

六、事务-5.事务隔离级别_第21张图片

3)左侧由于刚刚查了没有id为3的数据,此时insert插入id为3的数据,会报错:account表中的主键id为3重复了

六、事务-5.事务隔离级别_第22张图片

4)左侧再select查id为3的数据,依旧查不到——幻读:查又查不到,插入又报错

六、事务-5.事务隔离级别_第23张图片

5)左侧提交commit,结束事务

六、事务-5.事务隔离级别_第24张图片

6、幻读——serializable不会出现幻读问题

1)左侧设置隔离级别为serializable,左右开启事务

六、事务-5.事务隔离级别_第25张图片

 2)左侧select查询id为4的数据(无id为4的数据),

六、事务-5.事务隔离级别_第26张图片

3)右侧insert插入一条id为4的数据,执行光标一直在闪,表示阻塞了

六、事务-5.事务隔离级别_第27张图片

因为此时左侧的事务正在操作,右侧的事务就得等,要等左侧事务执行完成并提交后,右侧才可操作。

4)左侧insert插入id为4的数据并提交,右侧之前光标闪的地方出现error结果(id为4已存在)

六、事务-5.事务隔离级别_第28张图片

5)右侧commit提交,结束事务

六、事务-5.事务隔离级别_第29张图片

串行化——并发事务操作时,只允许一次一个事务来操作,A事务在操作时,B事务要等,只有A事务提交后,B事务才能操作。

你可能感兴趣的:(MySQL,数据库)