8.31笔记(undo在ACID中保证了什么?)

## undo在ACID中保证了啥?
主要保证事务的A的特性,同时C和I的特性也有关系。
undo logs
再事务ACID中实现的是A的原子一致性
另外CI特依赖于undo
在rollback中将数据恢复到修改之前状态
在CSR实现中将redo当中记录未提交的事务进行回滚

什么是一致性快照?
每个事务开启时(begin),都会通undo生成一个一致性快照。

undo提供快照技术,保存事务修改之前的数据状态保证MVCC(多并发)
隔离性,mysqldump的热备恢复机制。

隔离级别和锁机制:
作用:主要提供I的特性秒另外页对于c特性也有保证
1,transction_isoiation:事务隔离性以下四种
RU:读未提交
RC:读已提交
RR:可重复读 :默认级别
SR:可串行化
存储引擎的读?
  这里读不代表sql层select,这里指的是page(数据页)的读取。
四种隔离级别的特点:
RU(read uncommitted):读未提交
可能出现的情况,脏页读,不可重复读,幻读

RC(read commited):读已提交
可能出现的问题,不可重复读,幻读

RR(repeatable read):可重复读
可能出现的问题,有可能出现幻读

SR(serializable):可串行化
串行化事务,以上问题都能避免,但是事务不能并发

案例演示:
查看事务隔离级别:
select @@transaction_isolation;
set global transaction_isolation='read-uncommitted';
临时调整。
例子演示:
一,开启俩会话修改成read-uncommited
1,2会话use world
查询两个会话检查下数据
1会话begin,修改某数据但是没提交
2会话begin,select * from city 会发现未提交的事务
结论:从2会话中读到1会话未提交的数据,该现象为脏读
在生产环境中不允许出现脏读。

二,不可重复读。
在2会话中事务中,在不同时间执行相同的查询命令时,读到了1会话正在发生变化的数=据。
违反了一致性和隔离性的保证。
对事务隔离性和数据最终一致性要求比较高的业务,不允许出现。
业务能能容忍是可以出现该现象。

三,幻读(生产中最低也要调整成RC)
RC和RR都有
准备:会话1先创建表test,录入数据
两边commit准备快照
1打开begin;
update test set num=100 where num>100;
2会话begin;
insert into test value();
commit
同时查询时,会发现更改大于100时候会多一行数据
在一个事务窗口中出现了更新操作时,出现了别的插入数据行的操作。

调整成RR
一,防止出现不可重复读的情况:
利用的时undo的一致性快照。mvcc重要功能
1会话开启事务,提交事务,2会话开启事务,但是没有提交,数据不会发生变化。
二,通过RR已经可以解决99%的幻读。为了更加严谨,增加了(rr级别下才有)GAP(间隙锁)锁,(行锁+gap=next-lock(后面所有数据加锁))%
加锁解决所有的幻读
开启commit
1会话中test表中,增加个num辅助索引。
begin开启事务
update num列数据。
不提交数据。
2会话插入数据。会发现插入不进去。,RR级别下产生行级锁(在索引所在行锁)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值