假设我有表在蓝表存储
public class MyTable
{
public string PK {get; set;}
public string RowPK {get; set;}
public double Amount {get; set;}
}和Azure队列中的消息,上面写着将10添加到数量中。
现在让我们说一个工人的角色
Table
中的
一段时间后,消息再次在队列中可用。因此,下一个工作人员角色:
Table
消息中更新行
这些操作将导致Amount += 20而不是Amount += 10。
我怎样才能避免这种情况呢?
发布于 2009-12-11 12:38:28
我建议您实现一种乐观的并发性。您发送的更新行的消息应该同时包含amount属性的“前一个值”和“新值”。
因此,试图更新行的第二个辅助角色将首先检查当前值是否仍然等于“前一个值”。如果不是,工人角色知道出了问题,例如,他可以取消消息而不执行更新。可能还会在某个日志中引发错误。
发布于 2009-11-24 15:35:51
在队列中放置的所有消息都必须是幂等的。工人的角色总是有一种不可能完成他的工作的机会,所以这个信息必须是可重复的。
因此,不要将+= 10作为一个任务,而是执行类似于amount = 300的操作。获取webrole中的当前金额,向其添加10,并将新的金额放到队列中。
我不确定这是不是正确的方法。如果你这样做的话,如果两个人同时尝试增加10,就会有问题。
发布于 2010-04-09 17:40:56
您是实现了这个,还是上面的代码行只是一些想法?
“金额”意味着你在考虑某种银行交易场景。直接使用SQL可能更好(因为您有ACID保证:http://blogs.msdn.com/ssds/archive/2009/03/12/9471765.aspx“我们一直支持服务中的完全ACID功能,并将继续这样做”)。
Afaik,我们可以说,windows azure中的“表”类似于googles bigtable,不是吗?
https://stackoverflow.com/questions/1763468
复制相似问题