5

快照隔离功能帮助我们解决了读者在大容量网站上锁定作者的问题。它通过在 SqlServer 中使用 tempdb 对行进行版本控制来实现。

我的问题是正确实现此快照隔离功能,是否只是在我的 SqlServer 上执行以下操作

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

我是否还必须编写包含 TransactionScope 的代码,例如

using (new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.SnapShot}))

最后,Brent 在这篇文章的“并发的隐藏成本”一节中指出了他的担忧,他在其中提到当您在 tempdb 中对行进行版本化时,tempdb 可能会用完空间,并且可能会出现性能问题,因为它必须查找版本化的行。所以我的问题是我知道这个网站使用快照隔离,其他人在大型网站上使用这个功能,你对性能有什么看法?

谢谢,雷。

4

1 回答 1

0

正如https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx中所述,“只需执行以下操作” ,“如果 READ_COMMITTED_SNAPSHOT 选项设置为关闭,您必须为每个会话显式设置快照隔离级别才能访问版本化行。” 您的第二个 ALTER DATABASE 命令将 READ_COMMITTED_SNAPSHOT 设置为 ON,因此代码不需要指定该 TransactionScope。

性能硬币有两个方面,每当人们寻求关于性能“足够”与“不足”的意见时:“供应”是平淡无奇或“需求”是压倒性的......对于这篇文章,“供应”可以指与 tempdb 使用的性能和空间有关,而“需求”可能与对 tempdb 的写入发生率有关。在供应方面,可以使用各种硬件(从单轴 5400 RPM 磁盘到 SSD 阵列)。在需求方面,这不是 SQL Server 问题(尽管未能正确规范数据库设计可能是一个因素),与其客户端代码问题一样多。

My SQL Server 看到客户端同时要求大约 50 次写入/分钟和 2000 次批处理/分钟,其中写入通常在 OTLP/短端。对于每个 SQL Server,我有 1 TB 的数据库和 30 GB 的 tempdb。所有数据库通常都归一化为第三范式。所有数据库都在 SSD 上运行。我不担心超过 tempdb 磁盘的 IO 吞吐能力。因此,我不必担心在我的系统上启用快照隔离。但是,我见过其他尝试启用快照隔离的系统,但很快就放弃了。

您的系统的体验可能与任何其他受访者的系统相差几个数量级。您应该寻求分析/可靠地重放系统的写入,以及重放 tempdb 的其他用途(包括排序),以便为您自己的系统得出您自己的结论(对于具有足够空间让您的系统产生的各种硬件) tempdb 大小)。负载测试不应该是事后的想法:)。您还应该对 tempdb 磁盘的 IO 吞吐能力进行基准测试 - 请参阅https://technet.microsoft.com/library/Cc966412,并准备好在其 IO 吞吐能力最终不足时花更多的钱。

于 2015-08-11T23:33:57.463 回答