DbDataReader内部工作

时间:2017-07-03 18:19:06

标签: c# sql-server database ado.net

我们有高负载系统,包括SQL Server和.NET应用程序。 我们使用DbDataReader从SQL检索数据并将其保存到JSON中以通过网络发送它。我们的系统对插入或修改的所有记录使用时间戳,以便仅通过网络发送更新的数据(每个表都有提取日期时间列,在插入或修改记录时会更新)。

在某些情况下,我们看到一些记录会在我们持久化JSON的同时在数据库中更新。对于那些记录,我们不会在JSON中看到它们,但在我们手动检查时在DB中显示正确。更奇怪的是,JSON中存在具有相同日期时间戳(最多毫秒相同)的其他记录。所以问题是,下次我们从数据库中检索数据时,我们只会获得超过特定日期时间的记录,这会导致丢失的几个记录在编写JSON的同时被修改。

我最初的想法是,在编写JSON时,记录未被修改可能是时间问题。但是你如何处理这种情况呢?

所以我的问题是DbDataReader只会返回执行DbCommand.ExecuteReader()时存在的记录,或者它还会返回在数据库中修改后的记录?

1 个答案:

答案 0 :(得分:0)

  

问题是,下次我们从数据库检索数据时,我们只会获得超过特定日期时间的记录,这会导致丢失几对记录

您似乎正在尝试从SQL Server表中提取不相交的行子集。在这种情况下,没有必要深入了解事务隔离级别的细节。

最重要的是,除非你采用持续至少几毫秒的表锁,否则不能使用datetime列从SQL Server表中提取不相交的delta。您会在提交行时看到行,而不是写入行。因此,即使时钟分辨率是无限的,事务也可以以与读取时钟不同的顺序提交并写入行。

可以使用rowversion列,因为SQL Server会为每个事务增加值。

或者您可以构建提取逻辑以期望重叠行。

或使用事务复制,更改数据捕获或更改跟踪。