我们在LINQ
应用程序中使用ASP .NET
来运行数据库查询和命令。我们在更新表时遇到并发问题,我们在其中更新了Date
字段的值。更具体地说,如果两个用户在同一时间单击按钮并且代码尝试更新数据库中的Date
字段,则内置的乐观并发无法完成其工作,并且用户会抛出异常。
这是奇怪的部分,如果我们进入DBML
并将字段的time stamp
属性设置为true并运行单元测试它就可以正常工作......不需要显式锁定。
我们希望在整个系统中实现这一点之前先了解一点。有没有人对这为何有效有所了解?
答案 0 :(得分:2)
在不知道系统细节的情况下,我猜这是因为SQL Server DATETIME最多具有3 ms的分辨率,因此很有可能发生冲突。 TIMESTAMP是一个令人沮丧的反击者,不会发生冲突。
答案 1 :(得分:0)
请查看这些:
答案 2 :(得分:0)
从内存来看,我相信这就是它的工作原理:
默认的乐观事务确保行上的所有以前的值在允许UPDATE之前是相同的。
通过将“Time Stamp”属性设置为True,您告诉系统DB会自动生成特定列,并应将其用作“时间戳类型”列。换句话说,如果该列的值仅与UPDATE之前的值相同,则允许UPDATE。
由于您的单元测试失败而没有为DateTime列启用时间戳,我猜您还会更改该行上的其他内容,从而触发冲突。在DateTime列上启用时间戳后,更改会发生如此接近,以至于它们具有相同的时间。
您应该能够使用SQL事件探查器验证此行为。
FWIW,我怀疑这实际上不是你想要的行为......