MYSQL的隔离级别

- 查看数据库隔离级别

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,但是串行化会导致效率慢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值