如何正确实现快照隔离和tempdb问题?

时间:2009-03-16 22:24:30

标签: sql-server transactions snapshot-isolation

快照隔离功能可帮助我们解决读者在高容量网站上锁定作者的问题。它是通过在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}))

最后,布伦特在this post的“隐藏的并发成本”一节中指出了他的关注,他提到你在tempdb中对行进行版本化时,tempdb可能会用完空间,并且可能会遇到性能问题,因为它必须查找版本化的行。所以我的问题是我知道这个网站使用快照隔离,其他人在大型网站上使用此功能,你对性能的看法是什么?

THX, 射线。

1 个答案:

答案 0 :(得分:0)

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

表演硬币有两个方面,每当一个人寻求关于表现的意见是“足够”而不是“不足”时:要么“供应”不足或“需求”压倒一切......对于这篇文章,“供应” “可以引用tempdb使用的性能和空间,而”需求“可能涉及写入tempdb的速率。在供应方面,可以使用各种HW(从单个主轴5400 RPM磁盘到SSD阵列)。在需求方面,这不是SQL Server关注的问题(尽管未能正确地规范化数据库设计可能是一个因素)与客户端代码问题一样多。

我的SQL Server看到客户端同时要求大约50次写入/分钟和2000次批次/分钟,其中写入通常在OTLP /短边。每个SQL Server我有1 TB的数据库和30 GB的tempdb。所有数据库通常标准化为第3范式。所有数据库都在SSD上运行。我不担心tempdb磁盘的IO吞吐量容量被超出。因此,我不担心在我的系统上启用快照隔离。但是,我已经看到其他系统尝试启用快照隔离,但很快就放弃了。

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