2

如果 userA 删除 OrderA 而 userB 正在修改 OrderA,那么 userB 保存 OrderA 则数据库中没有要更新的订单。我的问题是没有错误!SqlDataAdapter.Update 成功并返回一个“1”,表明一条记录已被修改,如果这不是真的。有谁知道这应该如何工作,谢谢。

4

4 回答 4

1

当不能无状态工作时(如 web 服务工作),你可以尝试悲观锁定;更多信息在这里(虽然是 VB 示例):https ://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1049842.html

于 2010-05-18T20:57:04.580 回答
1

您至少需要使用乐观锁定。看这里:

乐观锁定

基本上,这表示您在更新期间检查所有字段的值。所以你说,例如假设当你第一次读取记录 1 时,bar 等于 0:

UPDATE FOO SET BAR=1 WHERE ID=1 AND BAR=0

这个想法是,如果记录发生变化,更新将失败。这将解决您的问题。

于 2010-05-18T20:58:01.887 回答
1

我也发现乐观并发是最好的方法。

应该只决定使用哪个数据库字段作为更新失败的标准。这取决于您的情况,但是有一种通用的方法可以实现这一点。我个人使用 MS SQL Server,因此更喜欢在数据库的所有表中插入不可为空的rowversion字段(别名timestamp)(每个表一个字段)。因此,表中的每一行都会有一个“ ”,如果有人更新该行的字段,rowversion它将自动更新。所以你应该使用这个字段作为更新失败的标准。另请参阅我的旧答案Concurrency processing of Sql transactrion以获取关闭信息。

更新:因为您用于SqlDataAdapter访问数据库,所以此链接对您来说也可能很有趣:

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1050108.html

在下一个上只需搜索DataRowVersion

http://msdn.microsoft.com/en-us/library/ww3k31w0(VS.71).aspx,http://msdn.microsoft.com/en-us/library/bbw6zyha(VS.80).aspx_ _ http://msdn.microsoft.com/en-us/library/ms971491.aspx,http://msdn.microsoft.com/en-us/magazine/cc163908.aspx _ _

于 2010-05-19T00:08:00.383 回答
0

我遇到了和你类似的情况。它涉及一个SqlDataAdapter,一个SqlCommandBuilder与之相连的,和一个DataTable对象。我所做的更改始终未能保存,但没有出错。原来,DataTable对象中的一列名称错误。一旦我纠正了它,它就开始完美地工作了。我仍然不知道为什么这没有引发错误。

于 2011-03-22T20:34:55.227 回答