2014-04-07 31 views
0

像标题:是否有任何并行执行发生在SQL服务器?。 我的情况是这样的: 产品表:是否有任何并行执行发生在SQL服务器?

ProductId Name Amount 
1   one 1 

更新语句(此语句可以把存储过程中的SQL或原始的SQL语句从.NET代码):

Update Product set Amount = Amount - 1 where ProductId=1 

所以在我的UI布局,我有一个按钮来执行上面的更新语句。当我把这个网站发布到互联网上时,假设两个用户(或更多)同时进入我的网站,同时确切地是并且同时点击这个按钮正好是。所以如果这更新声明执行我的金额栏将小于0(在这种情况下,它将是-1)。但我的逻辑是金额栏必须大于或等于0。我知道sql中的并发编辑数据,我们有乐观或悲观的方法来处理这个问题,因为我的知识乐观和悲观的方法只是为了重叠时间(一个在另一个之前执行)。我想知道如何处理这个问题,如果发生。因为我在购物网站上工作,并且我想向用户宣布此产品已售罄或存在的友好讯息。我认为我不在乎我使用ADO.net或EF或其他来做到这一点,只是在.NET和SQL工作的情况下。请给我一些建议或深入解释这种情况,因为我谷歌这么多,但没有发现任何东西看起来像这样。如果我不正确,请更正我的信息,因为我的英语不够好,无法理解我提到的一些文章! 非常感谢。

+0

它们总是先执行一个,因为即使假定SS接受并行请求,它们也会被同步(但并行执行)。为了检测这种情况,IMO最简单的方法是使用时间戳。如果您想要更新的记录在您阅读后已更新,那么这意味着您必须将此情况通知给用户(经典的预订服务示例)。 –

+0

您可以添加产品的约束也看交易水平http://stackoverflow.com/questions/tagged/sq – danisius

+0

@阿德里亚诺我只是想明白你的想法清楚这个词:“即使假设SS接受并行请求,他们会同步(但并行执行)“。你的意思是.net发送并行请求到sql,但是sql会同步它们并像队列一样执行一个?什么是SS含义! – vietvoquoc

回答

1

这与平行度无关。如果没有它,它可能会出错。 UPDATE语句是原子的,因此它们将始终被连续执行(尽管没有发言权哪一个首先发言)。

解决这个问题的最简单方法是在该表的UPDATE上做一个触发器,并且如果在已经为零时尝试更新则抛出异常。传播给用户的例外情况告诉他们的商品已售罄。为了更好地帮助顾客,提醒他这件商品是差不多卖完了,他必须要快。

+0

感谢您的帮助。如果在同一时间收到两个连接来执行此更新语句,sql会发生什么情况?对不起,这个额外的问题,但只是想确保我明白如何在这种情况下的SQL过程! – vietvoquoc

相关问题