没有合适的资源?快使用搜索试试~ 我知道了~
事物体系,看不懂你打我
需积分: 0 0 下载量 154 浏览量
2023-06-12
21:36:17
上传
评论
收藏 2.8MB PDF 举报
温馨提示
试读
25页
包含事物、锁机制、innoDB\日志等知识
资源推荐
资源详情
资源评论
今日份更新奉上~
innoDB引擎剖析√
mvcc解决脏读的具体工作流程√
mysql锁机制√
库存超卖问题--乐观锁√
近期目标:
undolog详解
binlog详解、其他日志浅解析(主要就是对事物的透彻理解
binlog8.0新特性
doublewriteBuffer8.0改进
binlog 和redo log二阶段提交
这里说明下,mysql事物和锁往往配合工作,所以这里放一起。然后做着做着,发现也离不开日志文
件,就在这里一并做了
mysql调优和索引会在另一篇文章。另外DQL语言也会有单独的体系博客分享。
注意:文章仅仅用于有基础的同学,用来加深、巩固自己知识体系,不做冗余的简单知识点介绍
版权声明:文章部分内容涉及hollis的《java八股文档》
我在这里保证,一篇吃透事物!mysql虽然有XA协议的实现,但是分布式事物会放到分布式专栏中。为
后续更好的区分。
Mysql事物
必备基础
mysql显示事物、mysql隐式事物(默认)
隐式事物,update inset帮我们隐式的提交
显示:
begin(begin work/start transaction)
操作a
操作b
commit/rollback
show variables like 'autocommit' on 隐式提交
msyql事物实现机制WAL(write ahead logging)
事物语法
mysql隔离级别有哪些,默认为什么级别
何为脏读,幻读,不可重复读
为何mysql把RR作为默认隔离级别,Oracle则是RC级别
set autocommit off;显示提交
注意,默认begin或者start transaction;会默认autocommit为off的
begin;
insert xxxx
savepoint s1;
insert xxxx
savepoint s2;
rollback to savepoint s1;
commit;
这里就不细讲了过于基础。可能会问你保存点savepoint
但是begin/start虽然会设置autocommit 为off
但是还是可能会隐式提交!!!!!!!!
1DDL语句,create alter drop 等
比如事物a,begin,update,然后DDL,这样你即使未提交,也是帮你提交了,回滚也不行!
2 begin 再begin 也会隐式提交
3 等复杂的语句,不是DBA不用也行~
mysql遵循数据库隔离级别,有ReadUncommited读未提交,RC读已提交,RR可重复读,Serializable可
串行化
问题, 读未提交有脏读问题,RC隔离级别有不可重复读问题,RR有幻读问题
mysql默认为RR隔离级别
脏读指的是读到了其他事物未提交的数据
不可重复读指的是在当前事物下 读两次数据不一样 和修改有关(update delete
幻读,强调的是查询范围上的不一致,(和插入有关)
Oracle只有RC Serializable 和 Read-Only
后两者隔离界别太高,】只有RC隔离级别适合
至于mysql 他首先排除Read Uncommited和Serializable 隔离级别过低/过高
过低:脏读现象,过高影响并发速度
至于RR与RC的隔离级别
mysql定位的是是稳定的关系型数据库,为了解决单调故障问题,mysql采用主从复制
主从复制中的binlog日志主要分为三种格式 statement\row\mixed
当为statement格式的时候,binlog日志记录的是sql的原文,
看下图:
RC和RR隔离级别有哪些差异
为何大厂选择将RC作为默认隔离级别?
在RC隔离级别下,执行update操作会触发行锁,仅仅锁这行数据而已,所以事物1并不影响事物2的执行
修改后的结果:11,2 20,2
binlog日志中 由于事物2 先commit的数据,所以从结点会先执行事物2 再执行事物1
结果为11,2 11,2
出现了主从不一致的情况
那么RR隔离级别,由于update操作不仅会触发行锁,还会触发gap锁和临键锁(next-key-lock
事物2会阻塞,binblog日志中先记录事物1的sql
所以mysql不允许RC和statment同时存在
总结
mysql为了主从复制一致性,为了兼容binlog的statment模式,选择RR为默认的事物隔离级别
一致性读(快照读) 锁机制 主从同步
RR隔离级别 事物开启的时候 只有第一次selet的时候才会生成readView,而RC在每次读都会生成
readView
注意不管是RR还是RC 每次读都会生成快照 ,区别是readView的生成策略。
此外,RC隔离级别还支持半一致性读
主从同步 RC只支持Row格式的binlog日志 RR支持statement、row、mixed
RC只有recordLock 而RR有RecordLock gapLocak nextkeylock
mysql如何解决脏读、不可重复读、幻读的
大厂嘛 最重要的当然是高并发
提高并发,由于RC隔离级别下只有行锁 不会有gaplock 和 nextKeyLock临建锁 此外,
RC隔离级别还支持半一致读,对于不符合更新条件的记录,直接释放锁,减少更新语句行锁的冲突
然后是减少死锁,由于RC隔离级别只有行锁
总结
为了提高并发和减少死锁
mysql通过mvcc解决脏读和不可重复读 MCCC+间隙锁解决部分幻读
脏读解决:
RC隔离级别下,通过mvcc机制,innoDB会在每行数据添加一个隐藏的事物id,只有数据的trxid小于当前事
物的id时,才会被读到,
也就是说,通过mvcc的trxid,使事物读不到未提交的数据,解决脏读
不可重复读解决:
在RR隔离级别下,通过mvcc机制解决,快照读只会在第一次select生成readView,后续所有的读,都是这
个快照,解决可重复读,
幻读的解决:
只有Serializable读才能彻底解决
RR隔离级别下,通过mvcc+间隙锁解决了幻读,要分当前读和快照读
对于快照读,读的使一个快照,mvcc就能解决 如下图
对于当前读何为当前读:加锁select和增删改操作
加锁select: 读锁(s锁,LOCK in share mode),写锁(for update
mvcc+间隙锁能解决的当前读 幻读问题,在事物开始时就当前读 此时会加锁,不仅时行锁,
还有间隙锁,其他事物insert时,会阻塞,如下图
解决不了哪些当前读的幻读问题?
就是解决不了来不及加间隙锁的情况,
就是事物开启先执行的是非加锁selet,然后再进行当前读,比如select for update /update语句
此时是当前读,不再读快找,于是乎发生了幻读
如下图
剩余24页未读,继续阅读
资源评论
不吃青椒!
- 粉丝: 405
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功