## 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级别下产生行级锁(在索引所在行锁)。
8.31笔记(undo在ACID中保证了什么?)
最新推荐文章于 2024-08-23 10:27:05 发布