- 查看数据库隔离级别
show variables like '%ISOLATION' -- 查看系统的隔离级别
select @@global.tx_isolation -- 查看全局的隔离级别
select @@tx_isolation -- 查看当前会话的隔离级别
- 修改两个会话的隔离级别的READ UNCOMMITED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- 在客户端A中修改数据但不提交事务
begin;
update goods set sale_price = 10000 where goods_id = 1
在客户端B中查询— 结果出现10000
在客户端A中回滚— ROLLBACK;
在客户端B中再次查询— 结果为100
此时造成的原因就是隔离级别读未提交的情况下脏读现象
客户端B读取到了A中的未提交的数据,查询语句无限制
目前莫有碰到这种级别的操作
- 修改两个会话的隔离级别的READ COMMITED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
执行上面相同操作
发现在客户端B中看不到10000 了,读已提交级别是对查询语句做了限制,只能
读取到已提交的数据
- 在客户端A中执行修改语句但不提交事务
begin;
update goods set sale_price = 10000 where goods_id = 1
此时在客户端B中查询语句查询不到10000
然后 客户端A提交了事务数据值发生了改变 commit;
此时客户端A中查询语句再查询一次查询到了10000
这种现象就是不可重复读,在客户端A的一个事务中我同一个sql两种结果
- 修改两个会话的隔离级别的READ COMMITED
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
为了演示出可重复读效果,在客户端B中查询之前也开启事务
start TRANSACTION;
update goods set sale_price = 10000 where goods_id = 1
COMMIT;
-- ROLLBACK;
---------
start TRANSACTION;
select * from goods
commit;
在客户端A中开启事务,在客户端B中开启事务
当A修改事务但不提交,此时B中查询不到
当A中提交事务,B中仍然读不到
B提交事务再执行查询语句就可以查到
在事务未提交前B中查询很类似一种快照的存在
如果A中不是修改而是删除或者新增,B中会出现幻读的现象,这个时候数据库
为了解决提供了串行化的隔离级别 serializable,但是串行化会导致效率慢