DBML中的时间戳正在解决并发问题......为什么?

时间:2009-12-07 23:56:22

标签: asp.net linq linq-to-sql timestamp datacontext

我们在LINQ应用程序中使用ASP .NET来运行数据库查询和命令。我们在更新表时遇到并发问题,我们在其中更新了Date字段的值。更具体地说,如果两个用户在同一时间单击按钮并且代码尝试更新数据库中的Date字段,则内置的乐观并发无法完成其工作,并且用户会抛出异常。

这是奇怪的部分,如果我们进入DBML并将字段的time stamp属性设置为true并运行单元测试它就可以正常工作......不需要显式锁定。

我们希望在整个系统中实现这一点之前先了解一点。有没有人对这为何有效有所了解?

3 个答案:

答案 0 :(得分:2)

在不知道系统细节的情况下,我猜这是因为SQL Server DATETIME最多具有3 ms的分辨率,因此很有可能发生冲突。 TIMESTAMP是一个令人沮丧的反击者,不会发生冲突。

答案 1 :(得分:0)

答案 2 :(得分:0)

从内存来看,我相信这就是它的工作原理:

默认的乐观事务确保行上的所有以前的值在允许UPDATE之前是相同的。

通过将“Time Stamp”属性设置为True,您告诉系统DB会自动生成特定列,并应将其用作“时间戳类型”列。换句话说,如果该列的值仅与UPDATE之前的值相同,则允许UPDATE。

由于您的单元测试失败而没有为DateTime列启用时间戳,我猜您还会更改该行上的其他内容,从而触发冲突。在DateTime列上启用时间戳后,更改会发生如此接近,以至于它们具有相同的时间。

您应该能够使用SQL事件探查器验证此行为。

FWIW,我怀疑这实际上不是你想要的行为......