博客
关于我
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/

你可能感兴趣的文章
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>