阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

事务和 SQL Server 2014 中的内存 OLTP

  • 2013-10-08
  • 本文字数:1660 字

    阅读完需:约 5 分钟

SQL Server 内存 OLTP 中的事务是非常直接的。虽然我们并不会讨论一些可能的优化,但是它的基础设计模式是相当容易理解的,并且能够在其他的项目中重用。

SQL Server 内存 OLTP 中的事务依赖于一个类似时间戳的结构,被称为事务 ID。一个事务使用两个时间戳,一个用于操作的开始,另一个在提交事务的时候为它分配值。多个事务能够共享同一个开始值。

同样的,在内存中每一行记录的每一个版本都有一个开始和一个结束事务 ID。基本的规则是,一个事务仅能够读取满足 RowVersion.StartingId <= Transaction.StartingId < RowVersion.EndingId 条件的数据。

对于 DELETE 操作,行版本的结束 ID 首先会被设置成事务的开始 ID。然后会设置一个标记表明一个事务正在处理中。

UPDATE 操作的开始和 DELETE 操作相似,它会将之前的行版本设置为结束事务 ID。然后会创建一个新的行版本,它的开始事务 ID 等于事务的开始 ID。结束 ID 首先会被设置为无穷大,然后再次设置一个活动事务标记。旧的行版本还会获得一个指向新的行版本的指针。

INSERT 操作和 UPDATE 操作完全相同,但是不需要删除之前的行版本。

提交和验证

在提交阶段,首先会为当前事务分派一个唯一的事务 ID。然后会开始一个验证流程,该流程对受影响的记录进行隔离错误检查。错误的类型依赖于请求的事务隔离级别。内存优化表仅支持三个级别,快照(Snapshot)、可重复读(Repeatable Read)和序列化(Serializable)。

快照

和正常的表一样,如果在另一个事务试图插入新行的时候向内存优化表中插入数据也会失败。但是它失败的方式有一点不同。通常情况下,一个事务必须等待其他事务完成,之后失败的事务仅会看到重复行,但再也不会尝试插入操作。

但是在这里我们会看到两个事务都插入了它们自己的行。之后它们将会读回数据以便查看自己是否赢得了竞赛。如果没有,那么就会产生 41325 错误,对应的消息是“对表 [表名] 的可重复读验证失败,当前事务无法提交”。

可重复的读事务

对于可重复读隔离级别,MSDN 上有这样一个警告:“需要注意的一件重要的事情是,因为可重复读隔离级别是利用其他事务的阻塞来实现的,所以使用该隔离级别极大地增加了事务执行过程中所持有的锁的数量”。

因为内存优化表没有锁,所以针对它们的可重复读非常特别。它并不会阻塞其他的事务,而是重新读取事务最后的行。如果这些行有任何一行发生了变化,这个事务就会被中止。这种情况对应的错误码是 41305,对应的消息是“对表 [表名] 的可重复读验证失败,当前事务无法提交”。

序列化事务

和可重复读相似,序列化事务并没有使用传统的方式,通过锁避免让其他的事务对正在检查的数据产生干扰。相反的,它会进行检查以便清楚自己是否能够成功读取任意有效行或者是否遇到了不真实的行。这两种情况中的任何一种都会导致事务再次被中止。

提交处理

如果验证成功,那么每一个受影响的行版本的结束事务 ID 都将会被设置为事务的结束 ID。同样的,新的行版本(例如插入和更新所产生的)的开始 ID 会被设置为事务的结束 ID。活动标记会被清除,索引会被更新到指向新记录。

垃圾收集器

应该注意的是,并不需要从索引中移除指向旧的行版本的指针。也不需要立即将旧版本删除。

内存优化表要求使用引用计数垃圾收集器。详细信息现在还不得而知,但是基于设计的剩余部分我们能够预测出它的行为。GC 需要从索引处启动,检查哪些索引指向了过时的行。如果发现了这样的行,它就会减少引用计数并且更新索引使其指向最近的行版本。如果计数器变成了 0,那么行版本就会被删除。

关于垃圾收集器最棘手的部分是如何知道首先要查看哪些行。人们会推测对每一个索引的所有行进行简单的迭代,但这种方式的成本会相当高。

设计注意事项

在使用内存 OLTP 的时候,开发者需要对自己的访问模式有非常清晰的认识。如果在编写代码的时候没有避免重叠事务,那么就会导致隔离级别违规,产生比使用传统表更多的事务中止问题。

如果想要了解更多的信息,可以阅读 Kalen Delaney 的 SQL Server In-Memory OLTP Internals Overview for CTP1

查看英文原文 Transactions and SQL Server 2014’s In-Memory OLTP

2013-10-08 08:261450
用户头像

发布了 321 篇内容, 共 115.9 次阅读, 收获喜欢 18 次。

关注

评论

发布
暂无评论
发现更多内容

Docker 镜像的备份恢复迁移

哈喽沃德先生

Docker 容器 微服务 镜像

面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》

小傅哥

Java 数据结构 面试 小傅哥 linkedlist

5G边缘计算:开源架起5G MEC生态发展新通路

华为云开发者联盟

开源 5G 边缘计算 公有云 EdgeGallery

一个空格引发的“救火之旅” - 记一次 SOFA RPC 的排查过程

阿里云金融线TAM SRE专家服务团队

Redis常见问题--哈希冲突

是老郭啊

哈希表 Redis项目

架构师训练营第十二周作业

张明森

小小的分页引发的加班血案

架构师修行之路

架构

【读书笔记一】《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》

Man

中台 阿里 中台战略

oeasy教您玩转linux010108到底哪个which

o

30年技术积累,技术流RTC如何成为视频直播领域的黑马?

华为云开发者联盟

云计算 AI 5G RTC 华为云

大事情!中国限制 AI 算法出口。网友:这是要阻止XX“下跪”

程序员生活志

mPaas研发流程和线上运维介绍

阿里云金融线TAM SRE专家服务团队

ios android

一文带你深扒ClassLoader内核,揭开它的神秘面纱!

我没有三颗心脏

Java ClassLoader java基础 类加载器

Ray 分布式计算框架详解

lipi

分布式 数据湖 pandas Apache Arrow

oeasy教您玩转linux010109clear清屏

o

雪花算法把玩

ElvinYang

pandas ~基础pandas

南辞

Python

高并发系统三大利器之降级

java金融

软件产品的创新与宇宙奇点大爆炸

常平

方法论 产品思维 架构思维

Flink检查点、保存点及状态恢复-13

小知识点

scala 大数据 flink

JVM 内存模型、字节码、垃圾回收面试要点

escray

学习 面试 垃圾回收 字节码

架构师训练营第十二周总结

张明森

翻转链表算法、自动化测试框架robot-framework、两款iOS 在手机端debugging 工具Flex、啄木鸟、加密技术 高可用系统的度量 高可用系统的架构 高可用系统的运维 John 易筋 ARTS 打卡 Week 15

John(易筋)

ARTS 打卡计划 高可用系统的架构 翻转链表 自动化测试Robot 手机调试工具Flex

麦叔告诉你,Linux下安装nginx都踩了那些坑

麦洛

nginx Linux

ARTS Week14

时之虫

ARTS 打卡计划

k8s-client-go源码剖析(二)

远鹏

Kubernetes 源码剖析 Go 语言

LeetCode题解:155. 最小栈,单个栈同时存储最小值,JavaScript,详细注释

Lee Chen

大前端 LeetCode

OpenKruise:Kubernetes 核心控制器 Plus

郭旭东

Kubernetes 云原生 OpenKruise

LeetCode 5. Longest Palindromic Substring

liu_liu

算法 LeetCode

银行大数据新玩法,构建“一湖两库”金融数据湖

华为云开发者联盟

大数据 数据湖 FusionInsight MRS DWS

一键洞察全量SQL ,远离性能异常

华为云开发者联盟

数据库 sql 大数据 数据治理 华为云

事务和SQL Server 2014中的内存OLTP_架构_Jonathan Allen_InfoQ精选文章