博客
关于我
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 CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
Musetalk如何优化嘴部,提高清晰度?
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
mysql explain关键字执行计划表解析系列一
查看>>
MVC 区域功能
查看>>