首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure表存储数据一致性

Azure表存储数据一致性
EN

Stack Overflow用户
提问于 2009-11-19 14:00:16
回答 4查看 1.4K关注 0票数 2

假设我有表在蓝表存储

代码语言:javascript
复制
public class MyTable
{
  public string PK {get; set;}
  public string RowPK {get; set;}

  public double Amount {get; set;}
}

和Azure队列中的消息,上面写着将10添加到数量中。

现在让我们说一个工人的角色

Table

  • And Fails

中的

  1. 从队列中获取消息
  2. 从表
  3. Amount += 10
  4. 更新行

一段时间后,消息再次在队列中可用。因此,下一个工作人员角色:

Table

  • Removes

  • 从队列中获取消息

  • 从表

  • 中获取行+= 10

  • 在queue

消息中更新行

这些操作将导致Amount += 20而不是Amount += 10

我怎样才能避免这种情况呢?

EN

回答 4

Stack Overflow用户

发布于 2009-12-11 12:38:28

我建议您实现一种乐观的并发性。您发送的更新行的消息应该同时包含amount属性的“前一个值”和“新值”。

因此,试图更新行的第二个辅助角色将首先检查当前值是否仍然等于“前一个值”。如果不是,工人角色知道出了问题,例如,他可以取消消息而不执行更新。可能还会在某个日志中引发错误。

票数 2
EN

Stack Overflow用户

发布于 2009-11-24 15:35:51

在队列中放置的所有消息都必须是幂等的。工人的角色总是有一种不可能完成他的工作的机会,所以这个信息必须是可重复的。

因此,不要将+= 10作为一个任务,而是执行类似于amount = 300的操作。获取webrole中的当前金额,向其添加10,并将新的金额放到队列中。

我不确定这是不是正确的方法。如果你这样做的话,如果两个人同时尝试增加10,就会有问题。

票数 1
EN

Stack Overflow用户

发布于 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,不是吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1763468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档