.NET SQLDatareader隔离读取

时间:2014-04-26 10:04:30

标签: sql .net sql-server transactions isolation

我有一个SQL Server数据库,用于存储包含信用的帐户(约200,000条记录),以及一个存储事务的单独表(约20.000.000)。

每当将交易添加到数据库时,都会更新信用。

我需要做的是更新客户端程序(使用Web服务)在本地存储信用,每当新事务添加到服务器时,它们也会被发送到客户端(使用delta的时间戳)。我的主要问题是为客户端创建第一个数据集。我需要提供所有帐户的列表以及交易表上的最后一个时间戳。

这意味着我必须创建此列表以及快照中的最后一个时间戳,因为在创建此列表期间的任何更新都意味着信用总计和最后一个事务时间戳不匹配。

我已经研究了ALLOW_SNAPSHOT_ISOLATION设置并在SqlCommand事务上使用了快照隔离,但是根据我的阅读,这将导致显着的性能损失。这是真的,可以用其他方法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

  

但是从我所看到的情况来看,这将导致显着的性能损失。

我甚至不想知道你在哪里阅读。 I'll refer you to the official document.成本来自用于行版本和遍历旧行版本的额外tempdb空间。如果您的写入速率较低,这些问题与您无关。

快照隔离是解决阻塞和一致性问题的福音。它非常适合您的场景。

Stack Overflow上的许多SQL Server问题让我评论“你有没有调查快照隔离?”。最缺乏使用的功能。

Oracle和Postgres一直都在使用它。

答案 1 :(得分:1)

不要急忙跳上SI旅行车。除此之外,它还有它带来的好处并且有它的缺点。

由于缺点,例如,应用程序可能依赖于阻止行为或/并且愿意等待最后一个版本的数据。您应该在SI下彻底测试应用程序,以确保它的行为正确。此外,未提交的事务可能会使版本存储混乱并导致tempdb的显着增长,因此监控是必须的。

此外,如果您通常不会遇到阻止问题,那么SI对您来说可能是一种矫枉过正。

相反,如果您需要的是一次性或接近它,请创建数据库的database snapshot,从该快照创建初始列表,然后简单地删除它。