如果userA在userB修改OrderA时删除了OrderA,则userB保存OrderA,则数据库中没有订单要更新。我的问题是没有错误! SqlDataAdapter.Update成功并返回“1”,表示如果不是这样,则修改了记录。有人知道这应该如何工作,谢谢。
答案 0 :(得分:1)
当不工作无状态(如webservices工作)时,你可以尝试悲观锁定;这里有更多信息(虽然是VB的例子):https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1049842.html
答案 1 :(得分:1)
您至少需要使用乐观锁定。见这里:
基本上,这表示您在更新期间检查所有字段的值。所以你说,例如假设你第一次读到记录1时,bar等于0:
UPDATE FOO SET BAR=1 WHERE ID=1 AND BAR=0
这个想法是,如果记录发生变化,更新将失败。这将解决您的问题。
答案 2 :(得分:1)
我还发现乐观并发是最佳方式。
应该只决定使用哪个数据库字段作为更新标准失败。这取决于您的情况,但有一种通用的方法可以实现这一点。我个人使用MS SQL Server,因此更喜欢在所有数据库表中插入不可为空的rowversion
字段(别名timestamp
)(每个表一个字段)。因此,表格中的每一行都会有一个“rowversion
”,它会自动更新 是有人更新该行的字段。因此,您应该使用此字段作为更新失败的标准。有关详细信息,请参阅我的旧答案Concurrency handling 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
答案 3 :(得分:0)
我遇到了与你类似的情况。它涉及SqlDataAdapter
,与SqlCommandBuilder
连接,以及DataTable
对象。我所做的更改始终无法保存,但没有出错。原来,DataTable
对象中的一列被误称。一旦我纠正它,它开始完美地工作。我仍然不知道为什么这不会引起错误。