3

我们将 LINQ to SQL 和 WCF 用于新的中间层,并且我们使用数据传输对象通过网络传递而不是使用实际的 LINQ 类。我将使用此处概述的一种或另一种方法 -基于时间戳或行版本的 Linq Table Attach() - 以确保更新正常工作并正确处理并发。

为了节省您的阅读时间,基本上您可以在表中使用时间戳/行版本列,或者使用具有默认值和更新触发器的日期时间列 - 无论哪种方式,它都会为您提供一个每次获取新生成值的列发生插入或更新,并且该列是 LINQ 用于检查并发性的列。

我的问题是——哪个更好?我们的许多表中已经有“UpdatedWhen”的日期时间列(但不是全部 - 不要问),但会添加默认值和触发器,或者我们可以只添加 rowversion(我们必须使用现在的时间戳语法,因为我们仍然支持 SQL2005 一段时间)到每个表 - 无论哪种方式我们都在修改数据库以使其工作,所以我想知道是否存在性能差异或任何这两种选择之间需要注意的其他重要区别。我试过在网上和这里搜索 SO,但到目前为止还没有运气。谢谢。

4

2 回答 2

4

我最近不得不做出类似的决定。

我首先尝试了 rowversion 解决方案。
我发现的缺点:

  • 在 LINQ-to-SQL 中使用不方便,我将字段映射到 byte[]。比较字节数组时,代码看起来不干净
  • 理论上rowversion可以翻转并重新从 0 开始,因此较高rowversion的行不一定是较旧的行
  • Rowversion 在任何行更新时都会更新,在我的情况下这是不可取的,我需要排除一些列以不影响行版本。拥有触发器允许实现任何级别的灵活性。

结果,我使用带有默认约束的 datetime2 列和更新触发器将值设置为 sysutcdatetime()
。这种类型的精度为 100 纳秒(精度 7 位 - 23:59:59.9999999)
。尽管这是可能的,但我从未见过两次生成相同值的情况。但在我的情况下,如果有重复,它不会受到伤害。如果它对我很重要,我会添加唯一约束,看看这是否会失败。

我使用 sysutcdatetime() 因为这个值不会受到夏令时的影响。

于 2011-05-07T18:22:04.160 回答
3

我倾向于使用时间戳列进行并发检查。一 - 触发器会对性能产生一些影响,二 - 对于日期时间列,您将自己限制在 SQL 和 C# 中 DateTime 列的精度。

MSDN:

日期时间值四舍五入为 0.000、0.003 或 0.007 秒的增量...

您可能想看看SO:C# 中的 DateTime 和 SQL server 中的 DateTime 之间有什么区别吗?MSDN:datetime (Transact-SQL)了解更多信息。

于 2011-05-06T17:42:02.173 回答