.NET应用程序中的数据库并发问题

时间:2010-05-18 20:52:52

标签: .net sql-server concurrency dataadapter

如果userA在userB修改OrderA时删除了OrderA,则userB保存OrderA,则数据库中没有订单要更新。我的问题是没有错误! SqlDataAdapter.Update成功并返回“1”,表示如果不是这样,则修改了记录。有人知道这应该如何工作,谢谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

Optimistic Locking

基本上,这表示您在更新期间检查所有字段的值。所以你说,例如假设你第一次读到记录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).aspxhttp://msdn.microsoft.com/en-us/library/bbw6zyha(VS.80).aspxhttp://msdn.microsoft.com/en-us/library/ms971491.aspxhttp://msdn.microsoft.com/en-us/magazine/cc163908.aspx

答案 3 :(得分:0)

我遇到了与你类似的情况。它涉及SqlDataAdapter,与SqlCommandBuilder连接,以及DataTable对象。我所做的更改始终无法保存,但没有出错。原来,DataTable对象中的一列被误称。一旦我纠正它,它开始完美地工作。我仍然不知道为什么这不会引起错误。