前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql锁&事务隔离级别—mysql进阶(七十)

Mysql锁&事务隔离级别—mysql进阶(七十)

作者头像
用户9919783
发布2022-07-29 13:51:28
4510
发布2022-07-29 13:51:28
举报
文章被收录于专栏:后端从入门到精通

Mysql隔离级别默认是repeatable read,他是不可以解决不可重复读,不可重复读是用mysql里面的mvcc解决,mvcc全称是mulit-version Concurrent Controller多版本并发控制,里面有个版本链readView。

一条数据记录都是由隐藏列、真实数据、额外数据,额外数据指描述真实数据的数据,也称呼为元数据,里面有最长字段长度列表,null值列表,头部信息,里面放着delete_mark,innoDB删除并不是真的删除,这也是插入数据回滚的时候,那个id会自动自增的原因,其中最长字段长度列表也可以细分,细分的话如果char在字符集为可变的时候,char的描述信息也会存在变长字段长度列表,字符集asicc是1个字符集,gbk是1~2个字符集,utf8是1~3个字符集。

真实数据是用户存储的数据,现在行格式默认是dynamic,以前是compact,以前的行格式是当页分裂的时候,真实数据列存储一部分真实数据了,其他的都存储页码号,指向真实数据的地址值,dynamic只存储页码号,真实数据存储在页里。

隐藏列主要有三个字段,row_id,trx_id,roll_pointer。Row_id不是必须的,只有当表里不存在主键,并且没有唯一列的时候,innoDB会默认会表提供一个row_id,trx_id和roll_pointer是必须的,一个是事务id,一个是指向回滚链表里的页,当指向的是delete或者update页的时候,里面会有个old_roll_pointer指向前一次事务发生的页,这个页正常是insert用于回滚。

扯远了,回到四个隔离级别,read uncommitted ,readcommitted,repeatable read,serialization,分别有幻读,脏读,不可重复读的问题。

而read committed和repeatable都是用mvcc来解决不可重复读,他们两的区别是read committed每次会生成一个read view,而repeatable read会复用之前生成的read view链表,然后从版本链中挑出可以显示给用户的数据。

ReadView的组成主要是由一条用户可见数据,也就是数据页上的数据,和以前改过的数据undo日志数据组成,第一条就是可见数据,后面的是历史数据。M_ids会把当前系统活跃的读写事务id存在这里。还有个最小值和最大值,判断当前事务读取那条数据,主要就判断这个readView里的trx_id与事务id的大小关系,当前事务id大于readView里的记录,说明当前事务在readView之后才开启,不可访问,反之小于则可以访问。

而锁分为排它锁和共享锁,共享锁上锁之后,其他事务只可以读不可写,排他锁上锁之后,其他事务不可以读也不可以写,根据颗粒度的不同又分为行锁和表锁,行锁和表锁有什么关系呢,当事务给行上了排它锁,也就是x锁,这时候会给表级别的锁上个ix锁,这个是在其他事物给表级别上锁之前,判断是否有行锁未释放使用的,总不能遍历所有行锁,当发现有其他行锁获取锁的时候,则会吧自己的事务设置为is_waiting为false,直到行锁释放,自己才会变成true。其实表锁挺鸡肋的,在特殊情况下下才会用到,比如系统恢复崩溃,一般 都是service的元数据锁来代替行锁的。

还有auto-insc锁,我们都知道可以设置自增的主键,可以用innoDB-auto-inscrent-mode系统参数来控制,当为1的时候,用auto-insc锁,2为轻量级别的锁,当为0的时候,两个锁混着来,auto-insc锁会吧新增的数据锁定,其他事物想新增必须等其释放锁,注意这个是对单个sql语句上锁,根前面读事务上锁不一样,这个sql语句结束,锁就释放,前面的都是必须事务提交擦释放锁。轻量级别的锁是知道新增的多少数据,这时候就不需要阻塞新增,这样可以避免等待,提升性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档