题目:将MySQL的隔离级别设置为读取未提交,做出脏读,不可重复读和幻读的效果
前提准备
创建数据库,创建一个表
创建数据库:
create database ceshi;
创建表:
CREATE TABLE test_table (
id INT PRIMARY KEY,
value VARCHAR(100)
);
插入数据
INSERT INTO test_table (id, value) VALUES (1, 'yujian');
查看当前隔离级别
当前会话: SELECT @@session.transaction_isolation;
全局: SELECT @@global.transaction_isolation;
设置会话就是在当前页面生效,其它页面不生效。我们需要创建两个会话页面。
都是可重复读级别。
配置读取未提交级别,两个会话都设:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
脏读
脏读指的是读当前事务读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据。
首先我们在第一张会话里面创建事务并修改数据:
开启事务:
START TRANSACTION;
修改数据:
UPDATE test_table SET value = 'llnb' WHERE id = 1;
然后我们在第二张会话里可以查到第一张刚刚修改的数据,但是第一张会话的事务并没有提交
不可重复读
不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
我们先回滚一下,回到最初的状态
ROLLBACK;
在两张会话里面都创建事务:
START TRANSACTION;
在第一张会话里查一下,会发现id为1的字段里是yujian
然后在第二张会话里修改字段并提交事务
UPDATE test_table SET value = 'llnb' WHERE id = 1;
COMMIT;
对比第一张会话前后两次查询到的数据,会发现两次查询的数据是不一样的。
幻读
幻读就是select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入
老样子,先回滚一下
ROLLBACK;
在一二张会话里开启事务
START TRANSACTION;
在第一张会话里查询所有记录
SELECT * FROM test_table;
然后在第二张会话里新增第二条记录并提交
INSERT INTO test_table (id, value) VALUES (2, 'llnb');
COMMIT;
在第一张会话里查询所有
会发现原本只有一条记录的表多了一条记录