MySQL 数据库事务
分类
- 扁平事务
- 带有保存断点的扁平事务
- 链事务
- 嵌套事务
- 分布式事务
隔离性的实现
MVCC(Multi-Version Concurrency Control)
:用于提交读的实现通过在每行记录后面保存两个隐藏的列来实现
保存了行的创建时间和过期时间 (都是以版本号的形式存储)
SELECT
:只查找当前事务版本在创建时间和**过期时间(可以无定义)**之间的数据INSERT、DELETE
:为新插入的每一行保存当前系统的版本号作为行的版本号UPDATE
:保存当前系统的版本号作为行的版本号以为,还会将当前版本号作为行的删除标志
- 加锁:
gap lock、record lock、next-key lock
- 一致性锁定读:
select .... for update.
写锁select .... lock in share mode
读锁
原子性和持久性的实现
redo log
称为重做日志;- 刷新到磁盘:
- 事务提交时
log buffer
内存用到一半的时候check point
的时候
- 刷新到磁盘:
过程
InnoDB
存储引擎把事务写入日志缓存(log buffer
),日志缓冲把事务刷新到事务日志:事务日志日志组中单个日志和磁盘扇区的大小一样,不需要doublewrite
可以保证原子性。InnoDB
存储引擎把事务写入缓冲池(Buffer pool
)这样做的原因:
对于
InnoDB
的任何修改都会在bp
上的page
完成,在后续会有专门的线程进行页面修改的写入:对于缓冲中数据还未刷入磁盘中,出现非正常关闭,因此将这些对页面的修改操作写入到redo log
日志中,在数据库启动的时候对其进行修复。之前的非正常关闭,
InnoDB
只能从上一个check point
使用重做入职来进行回滚
doublewrite
技术是开辟在
tablespace
的一块连续的空间。需要将缓冲池(Buffer pool
)中数据刷新到page
,首先会放入该区域中,然后将数据刷新到磁盘中。数据写失败情况
- 写入
doublewrite
失败,则会通过事务日志进行重新读取 - 写入磁盘失败,直接在
doublewrite
读取
- 写入
一致性的实现
undo log
保证一致性undo
实现MVCC
,读取一行记录时,发现事务锁定,通过undo
恢复到之前的版本,实现非锁定读取
日志系统
- 物理日志
- 新值和旧值的信息日志
- 逻辑日志
- 有关操作的信息日志
- 区别
- 物理日志恢复的速度快于逻辑日志
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论