如何选择行版本的隔离级别

简介: 基于行版本控制的隔离级别通过消除读取操作的锁来改善读取并发。Microsoft SQL Server 引入了两个使用行版本控制的事务隔离级别: READ_COMMITTED_SNAPSHOT 数据库选项为 ON 时,启用使用行版本控制的已提交读隔离的新实现。

基于行版本控制的隔离级别通过消除读取操作的锁来改善读取并发。Microsoft SQL Server 引入了两个使用行版本控制的事务隔离级别:

  • READ_COMMITTED_SNAPSHOT 数据库选项为 ON 时,启用使用行版本控制的已提交读隔离的新实现。

  • ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时,启用的新的快照隔离级别。

对于大多数应用程序,建议应用使用行版本控制的已提交读隔离,而不要应用快照隔离,原因如下:

  • 已提交读隔离比快照隔离占用的 tempdb 空间少。

  • 已提交读隔离可用于分布式事务,而快照隔离不能用于分布式事务。

  • 已提交读隔离可用于大多数现有应用程序,而不需要进行任何更改。可以动态优化使用默认隔离级别(已提交读)编写的应用程序。已提交读的行为(是否使用行版本控制)是由数据库选项设置确定的,可以对其进行更改,而不会影响应用程序。

    注意:
    对于设计为依赖于已提交读隔离的阻塞行为的应用程序,开发人员可能希望将应用程序更改为使用两种模式的已提交读隔离。否则,请注意将 READ_COMMITTED_SNAPSHOT 数据库选项保持为 OFF。
  • 快照隔离很容易发生不适用于使用行版本控制的已提交读隔离的更新冲突。当在快照隔离下运行的事务读取另一个事务稍后会修改的数据时,快照事务对同一数据的更新会导致更新冲突,该事务将终止并回滚。而使用行版本控制的已提交读隔离不存在此问题。

何时应用使用行版本控制的已提交读隔离

使用行版本控制的已提交读隔离提供语句级读取的一致性。事务中的每条语句执行时,新的数据快照将产生,并在该语句执行完成之前对每条语句保持一致。发生下列情况时,启用使用行版本控制的已提交读隔离:

  • 当并发好处大于创建和管理行版本所增加的开销时,将发生读取器/编写器阻塞。

  • 应用程序需要长时间运行的聚合或查询(其中数据值必须与查询启动时的时点一致)绝对精确。

何时使用快照隔离

快照隔离提供事务级读取的一致性。数据快照在快照事务启动时产生并在事务持续时间内保持一致。发生下列情况时,使用快照隔离:

  • 需要开放式并发控制。

  • 由于更新冲突必须回滚事务的可能性较低。

  • 应用程序需要基于必须具有时点一致性的长时间运行的多语句查询生成报告。快照隔离具有可重复读取的优点(请参阅),而不使用共享锁。数据库快照可以提供类似的功能,但必须手动实现。快照隔离自动为每个快照隔离事务提供数据库中的最新信息。

基于行版本控制的隔离级别的优点

使用行版本控制的隔离级别具有以下优点:

  • 读取操作检索一致的数据库快照。

  • SELECT 语句不会在读取操作期间锁定数据(读取器不会阻止编写器,编写器也不会阻止读取器)。

  • SELECT 语句可以访问最后提交的行值,同时其他事务更新该行,而不会受到阻塞。

  • 死锁的数量减少。

  • 事务所需的锁的数量减少,这减少了管理锁所需的系统开销。

  • 锁升级的次数减少。

基于行版本控制的隔离级别的开销

确定使用基于行版本控制的隔离需要对比最小化锁定的并发好处与维护和读取行版本所需增加的资源使用量。考虑下列与启用用于快照和已提交读隔离级别的行版本控制关联的开销:

  • 当查询所需的版本变旧且必须扫描长版本链时,会影响读取性能。

  • tempdb 中维护行版本时,行版本控制会增加修改数据过程中的资源使用量。

  • 当 READ_COMMITTED_SNAPSHOT 或 ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时,更新和删除特定数据库的事务必须维护行版本,即使不存在使用基于行版本控制的隔离级别的事务。构造使用行版本的一致的数据快照包括系统资源(CPU 和内存),并可能生成 I/O 活动。由于记录版本存储在 tempdb 中,因此当更多的 tempdb 页可以存储在行版本控制的内存中时,性能会更好,发出的 I/O 数也会更少。

    注意:
    通常,插入行不会生成行版本。但是,在某些情况下,INSERT 命令确实可以生成行版本。例如,如果在前一个删除的行版本(虚影记录)尚未截断时将行插入具有唯一索引的表中,则 INSERT 命令将生成行版本。
  • tempdb 必须具有足够的磁盘空间用于版本存储区。如果存在超长时间运行的事务,则更新事务在该时间内生成的所有版本都必须保留在 tempdb 中。如果 tempdb 运行空间不足,更新操作并不会失败,但使用行版本控制的读取操作可能会失败。

  • 行版本控制信息需要将 14 个字节添加到数据库行。

  • 由于维护行版本的工作,更新性能可能较低。在典型的 OLTP 工作负荷中,每个更新仅更改数据库中的一部分行。在这些系统中,与两个选项都为 OFF 的数据库相比,在选项为 ON 的数据库中更新的性能可能只低几个百分点。当在更新操作过程中更改更大量的数据时,版本更新的性能开销可能变高。

  • 数据读取器遍历版本链接列表时会引起其他开销。快照越旧,在快照隔离事务中访问快照的进程就越慢。

  • 由于更新操作的必需的冲突检测,某些使用快照隔离的更新事务可能必须回滚。在使用行版本控制的已提交读隔离下运行的事务不会生成更新冲突。

使用行版本控制的事务还有其他限制。有关详细信息,请参阅。

从基于行版本控制的隔离级别获益的系统

从基于行版本控制的隔离级别获益的方案包括:

  • 并行运行只读报告和即席查询以及更新数据的应用程序的系统。

  • 从支持类似隔离级别的其他关系数据库系统到 Microsoft SQL Server 数据库引擎的应用程序迁移。

  • 获取一致聚合(如 AVG、COUNT 和 SUM)或执行索引交叉和索引联接将需要一个严格的隔离级别(如可重复读或可序列化)的系统。

  • 具有由于读/写争用导致的大量死锁的系统。
目录
相关文章
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的高校迎新系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的高校迎新系统附带文章源码部署视频讲解等
128 0
带你读《2022技术人的百宝黑皮书》——HTTP3 RFC标准正式发布, QUIC会成为传输技术的新一代颠覆者吗?(4)
带你读《2022技术人的百宝黑皮书》——HTTP3 RFC标准正式发布, QUIC会成为传输技术的新一代颠覆者吗?(4)
216 0
|
机器学习/深度学习 传感器 算法
【元胞自动机】基于元胞自动机模拟晶体生长附matlab代码
【元胞自动机】基于元胞自动机模拟晶体生长附matlab代码
【元胞自动机】基于元胞自动机模拟晶体生长附matlab代码
|
Go 数据格式 JSON
golang之pkg(包)
一、概述   Golang拥有超过100个标准包(可用go list std |wc -l查看)   任何包系统设计的目的都是简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的模块以便于理解和更新,在每个模块更新的同时保持和程序中其他模块的相对独立,这种模块化的特性允许每个包能被其他的不同项目共享和重用,在项目范围内、全局范围内的复用;   每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。
2348 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
352 91
|
4天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
373 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
4天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~