当前位置:网站首页>MySQL当前读、快照读、MVCC
MySQL当前读、快照读、MVCC
2022-08-04 15:18:00 【知知之之】
当前读
当前读,读取的是最新版本,并且对读取的记录加锁,阻塞其他事务同时改动相同记录,避免出现安全问题。哪些形式的SQL属于当前读:
- select...lock in share mode (共享读锁)
- select...for update
- update , delete , insert
关于for update
利用select * for update 可以锁表/锁行。
自然锁表的压力远大于锁行。所以我们应尽量采用锁行。
FOR UPDATE仅适用于InnoDB,且必须在事务处理模块(BEGIN/COMMIT)中才能生效
那么什么时候锁表呢?
- 例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * FROM wallet WHERE id=’3′ FOR UPDATE; - 例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * FROM wallet WHERE id=’-1′ FOR UPDATE; - 例3: (无主键,table lock)
SELECT * FROM wallet WHERE name=’Mouse’ FOR UPDATE; - 例4: (主键不明确,table lock)
SELECT * FROM wallet WHERE id<>’3′ FOR UPDATE; - 例5: (主键不明确,table lock)
SELECT * FROM wallet WHERE id LIKE ‘3’ FOR UPDATE;
当前读的实现方式
当前读使用next-key锁(行记录锁+Gap间隙锁)实现间隙锁
:只有在Read Repeatable、Serializable隔离级别才有,就是锁定范围空间的数据,假设id有3,4,5,锁定id>3的数据,是指的4,5及后面的数字都会被锁定,因为此时如果不锁定没有的数据,例如当加入了新的数据id=6,就会出现幻读,间隙锁避免了幻读。
- 对主键或唯一索引,如果当前读时,where条件全部精确命中(=或者in),这种场景本身就不会出现幻读,所以只会加行记录锁。
- 没有索引的列,当前读操作时,会加全表gap锁,生产环境要注意。
- 非唯一索引列,如果where条件部分命中(>、<、like等)或者全未命中,则会加附近Gap间隙锁。例如,某表数据如下,非唯一索引2,6,9,9,11,15。如下语句要操作非唯一索引列9的数据,gap锁将会锁定的列是(6,11],该区间内无法插入数据。
快照读
单纯的select操作,不包括上述 select ... lock in share mode, select ... for update。
Read Committed隔离级别:每次select都生成一个快照读
Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读
快照读的实现方式
undolog和多版本并发控制MVCC
下图右侧绿色的是数据:一行数据记录,主键ID是10,name='Jack',age=10, 被update更新set为name= 'Tom',age=23。
事务会先使用“排他锁”锁定该行,将该行当前的值复制到undo log中,然后再真正地修改当前行的值,最后填写事务的DB_TRX_ID,使用回滚指针DB_ROLL_PTR指向undo log中修改前的行DB_ROW_ID。
DB_TRX_ID: 6字节
DB_TRX_ID
字段,表示最后更新的事务id(update,delete,insert)。
此外,删除在内部被视为更新,其中行中的特殊位被设置为将其标记为已软删除。DB_ROLL_PTR: 7字节回滚指针,指向前一个版本的undolog记录,组成undo链表。如果更新了行,则撤消日志记录包含在更新行之前重建行内容所需的信息。
DB_ROW_ID: 6字节的DB_ROW_ID字段,包含一个随着新行插入而单调递增的行ID, 当由innodb自动产生聚集索引时,聚集索引会包括这个行ID的值,否则这个行ID不会出现在任何索引中。
如果表中没有主键或合适的唯一索引, 也就是无法生成聚簇索引的时候, InnoDB会帮我们自动生成聚集索引, 聚簇索引会使用DB_ROW_ID的值来作为主键; 如果表中有主键或者合适的唯一索引, 那么聚簇索引中也就不会包含 DB_ROW_ID了 。其它:insert undo log只在事务回滚时需要, 事务提交就可以删掉了。update undo log包括update 和 delete , 回滚和快照读 都需要。
边栏推荐
猜你喜欢
Why, when you added a unique index or create duplicate data?
Redis-哨兵模式
Redis-主从复制
Basic Introduction for PLSQL
Hangzhou Electric School Competition (Counter Attack Index)
RTC 场景下的屏幕共享优化实践
leetcode: 259. Smaller sum of three numbers
I/O stream summary
(2022杭电多校五)C - Slipper (dijkstra+虚拟结点)
饿了么智能头盔专利获授权,进一步提升骑手安全保障
随机推荐
LeetCode_模拟_中等_498.对角线遍历
如何优雅的消除系统重复代码?
Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
性能提升400倍丨外汇掉期估值计算优化案例
Codeforces Round #811 A~F
Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
Nuget 通过 dotnet 命令行发布
remote: Check Access Error, please check your access right or username and password!fatal: Authenti
HarePoint Analytics for SharePoint Online
##ansible自动化运维架构与简介
全球电子产品需求放缓,三星手机越南工厂每周只需要干 3~4 天
Roslyn 通过 nuget 统一管理信息
leetcode: 254. Combinations of factors
从-99打造Sentinel高可用集群限流中间件
[Beiya data recovery] IBM System Storage storage lvm information lost data recovery solution
我爱七夕哈哈哈
AIX7.1安装Oracle11g补丁33829709(PSU+OJVM)
Zheng Qing freshmen school competition and middle-aged engineering selection competition
C# SolidWorks二次开发---工程图简单版标注孔信息
聊聊与苹果审核员的爱恨情仇