【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

事务和 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:261456
用户头像

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

关注

评论

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

架构师训练营第二周总结

烟雨濛濛

架构师训练营第二周总结

时来运转

架构师0期week2-作业

小高

编程的本质

GalaxyCreater

架构

架构师 0 期 | 架构师怎样实现架构目标?

刁架构

设计模式 极客大学架构师训练营

极客大学架构师训练营第二周学习总结

竹森先生

设计模式 架构设计 极客大学架构师训练营 面向对象设计原则

拼多多市值快 1000 亿美元了

池建强

创业 拼多多

作业2

annie

极客大学架构师训练营

架构师训练营-第二课作业-20200617-设计原则???

👑👑merlan

架构设计 软件设计

架构培训 -02 学习总结 架构师实现自己架构的主要手段

刘敏

架构师训练营第二周命题作业

whiter

极客大学架构师训练营

学习总结 -- Week2

吴炳华

极客大学架构师训练营

极客时间 - 架构师训练营 - week2 - 课堂笔记

毛聪

第二周课程学习总结

Geek_a327d3

作业

极客时间 - 架构师训练营 - week2 - 作业

毛聪

设计原则——依赖倒置原则

GalaxyCreater

架构

豆瓣9.0,35万读者“搜不到信息”的神秘作者,我们帮你找到了

华章IT

JVM 虚拟机 深入理解JVM Java 25 周年 周志明

设计原则

GalaxyCreater

架构

第二周作业

王鑫龙

极客大学架构师训练营

【总结】框架设计之架构师实现自己架构目标的主要手段

魔曦

极客大学架构师训练营

外包程序员的幸福生活

四猿外

架构师训练营第二周作业

时来运转

架构师培训第二周作业

talen

RPC实战与核心原理-学习笔记(4)

程序员老王

架构作业-第2周

铁血杰克

一周信创舆情观察(6.8~6.14)

统小信uos

新基建 信创

深入理解JVM垃圾回收机制 - 运行时栈帧的内存变化

SkyeDance

深入理解JVM 运行时栈帧

依赖倒置原则

清风明月

极客大学架构师训练营

依赖倒置原则理解

Thrine

02架构的方法论

ashuai1106

架构设计 极客大学架构师训练营 架构设计原则

Week2学习总结

铁血杰克

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