博客
关于我
MySQL 实战 45 讲笔记 | 事务隔离和 MVCC
阅读量:572 次
发布时间:2019-03-10

本文共 1162 字,大约阅读时间需要 3 分钟。

这篇文章总结了《MySQL实战45讲》中的内容,重点梳理了事务隔离级别和相关的高级事务机制,旨在帮助理解数据库管理中的关键概念。

事务隔离级别

SQL 标准的事务隔离级别包括四个级别:读未提交、读提交、可重复读和串行化。其中,InnoDB 默认的隔离级别是可重复读。在可重复读隔离级别下,一个事务在整个执行过程中,都将看到与事务启动时一致的数据库状态。所有讨论均基于可重复读隔离级别进行。

回滚日志

在 MySQL 中,所有更新操作都会伴随回滚日志(undo log)的记录。这些记录允许数据库在需要时恢复数据到之前的状态。然而,长事务会导致回滚日志占用大量存储空间,影响性能。因此,建议采用短事务模式,通过显式事务提交(如 `set autocommit=1`)来避免长事务的发生。

对于频繁的事务操作,可以使用 `commit work and chain` 功能。这一功能在autocommit为1的情况下,允许事务提交后自动启动下一个事务,减少了事务处理的交互次数,提高了效率。

MVCC机制

InnoDB 的多版本并发控制机制(MVCC)通过为每个数据行记录多个版本来解决并发问题。每个版本都有唯一的事务 ID(trx_id),并用事务数组跟踪活跃事务。事务数组保存的最小值称为低水位,最大的值加一则为高水位。

一个事务能够访问特定数据行的版本,是根据以下规则决定的:只允许查看trx_id小于低水位的版本,或틴字处于[低水位, 高水位)区间内且不在事务数组中的版本。此外,事务更新操作是先读后写的,而“当前读”操作(如锁定共享模式或插入 :|update)只能读最新的值。

可重复读的核心是提供一致性读(consistent read),确保在事务过程中,读者只能看到事务启动时的数据库状态。若当前记录的行锁已被其他事务占用,系统将阻止当前事务的读操作,直到锁解除。需要注意的是,表结构本身不支持可重复读,因为每个数据行并不具备行事务 ID。

幻读与间隙锁

幻读指的是同一事务在两次查询同一范围内,旧次查询未看到新次查询看到的记录,主要发生在插入新行时。为解决幻读问题,InnoDB 引入了间隙锁(gap lock),防止新插入记录填补数据行之间的间隙。这种机制与行锁共同构成“下一个键锁”(next-key lock),定义了前开后闭的区间。

间隙锁虽然解决了幻读问题,但也增加了锁冲突概率。特别是在可重复读隔离级别下,间隙锁是必须的;但在读提交隔离级别下则没有。另外,由于间隙锁锁住了更大的键范围,这会影响系统的并发度。此外,为了保证数据一致性,当隔离级别为读提交时,应将binlog格式设置为行模式(row)。

综上所述,理解这些机制的工作原理和最佳实践,对于优化数据库性能和确保应用程序的一致性非常重要。

转载地址:http://zyjvz.baihongyu.com/

你可能感兴趣的文章
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
web项目 log4j2 指定配置文件路径
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>