快照隔离功能可帮助我们解决读者在高容量网站上锁定作者的问题。它是通过在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, 射线。
答案 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吞吐量容量不足的情况下花更多钱。