测试前准备
准备一张表tran_test ,id为主键,使用innodb存储引擎
CREATE TABLE tran_test ( id INT PRIMARY KEY, NAME VARCHAR ( 10 ) ) ENGINE = INNODB;
插入3条数据
insert into tran_test values(1,'zhangsan');
insert into tran_test values(2,'wangwu');
insert into tran_test values(3,'lisi');
打开的会话窗口都需要关闭自动提交,默认为1:表示开启自动提交,设置为0:表示关闭自动提交
select @@autocommit;
set autocommit = 0;
事务隔离级别
事务的四个隔离级别(mysql默认可重复度,oracle默认读已提交)
- read uncommitted (读未提交)
会产生:脏读、幻读、不可重复度 - read commited (读已提交)
会产生:幻读、不可重复度 - repeatable read (可重复读)
会产生:幻读 - seariable (串行执行)
不会产生任何异常
脏读
一个事务会读到另一个未提交的事务数据。
不可重复读
一个事务内多次读取到的数据不一致,A事务第一次读到值是1, B事务把1修改成2,并且提交了,A事务第二次读到值也变成了2,针对update。
幻读
一个事务内多次读取到的数据不一致,第一次读到1条,第二次读到2条。针对insert,delete,数据行数发生了变化。
脏读问题测试
1、设置事务隔离级别
A:set session transaction isolation level read uncommitted;
A:start transaction;
A:insert into tran_test values(4,'zhaoliu');
A:select * from tran_test; --可以查询到最新插入的数据
B:set session transaction isolation level read uncommitted;
B:select * from tran_test; -- 也可以查询A最新插入的数据,尽管A的此时的事务还未提交

不可重复读问题测试
重复脏读的流程发现,新建的会话窗口是读不到其他会话中未提交的事务的。

但是会产生不可重复读问题
A:set session transaction isolation level read committed;
A:start transaction;
A:select * from tran_test where id = 1; --结果为zhangsan
B:start transaction;
B:update tran_test set name = 'zs' where id = 1; --把id为1的name修改为zs
A:select * from tran_test where id = 1; -- B未提交所以A此时查询结果还是zhangsan
B:commit;
A:select * from tran_test where id = 1; -- B事务提交后,A再查询此时结果已经变成了zs
A再同一个事务中,两次查询结果不一致。
幻读问题测试
重复上限测试,不可重复读和脏读问题都不存在。
A:set session transaction isolation level read committed;
A:start transaction;
A:select * from tran_test where id = 4; --结果为空
B:start transaction;
B:insert into tran_test values(4,'zhaoliu'); -- B插入一条id=4的数据
A:select * from tran_test where id = 4; --结果依旧为空
B:commit; -- B提交事务
A:select * from tran_test where id = 4; --结果依旧为空
A:insert into tran_test values(4,'zhaoliu'); -- 插入失败,报主键冲突
insert into tran_test values(4,'zhaoliu')
> 1062 - Duplicate entry '4' for key 'PRIMARY'
> 时间: 0s
A事务在查询时数据明明不存在,但插入却报主键冲突,就像出现幻觉一样。
当然隔离级别设置为序列化后,脏读、不可重复读、幻读问题都不存在,可自行测试。
本文详细介绍了如何在MySQL中设置不同的事务隔离级别,演示了脏读、不可重复读和幻读现象,并通过实际操作展示了这些隔离级别的效果。最后,强调了序列化隔离级别对防止这些问题的重要性。

2047

被折叠的 条评论
为什么被折叠?



