Azure表存储中跨多个表的事务

时间:2014-10-31 14:44:16

标签: azure transactions storage multiple-tables

我使用Extjs 5和azure表存储创建仪表板。 我使用表批处理操作(TableBatchOperation)完成了单表事务,但现在我想在多个表之间进行事务处理。 反正有没有实现这个目标?

同一个表可能有很多创建/删除和更新,这会影响许多具有不同分区键的表。

2 个答案:

答案 0 :(得分:3)

您可以考虑通过消息队列应用最终一致性事务模式。

看看这里: https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#eventually-consistent-transactions-pattern

将链接中的重要部分放在此处,以防它过期,我还略微更新了文本,而不是参考链接中的实际图表:

最终一致的交易模式

使用Azure队列启用跨分区边界或存储系统边界的最终一致行为。

背景和问题

实体组事务启用跨多个共享同一分区键的实体的原子事务。出于性能和可伸缩性的原因,您可能决定将具有一致性要求的实体存储在单独的分区或单独的存储系统中:在这种情况下,您无法使用实体组事务来保持一致性。例如,您可能需要在以下各项之间保持最终的一致性:

•实体存储在同一个表中的两个不同分区中,位于不同的表中,位于不同的存储帐户中。

•存储在Table服务中的实体和存储在Blob服务中的Blob。

•存储在Table服务中的实体和文件系统中的文件。

•Table服务中的实体存储,但使用Azure搜索服务编制索引。

<强>解决方案

通过使用Azure队列,您可以实施跨两个或多个分区或存储系统提供最终一致性的解决方案。为了说明这种方法,假设您需要能够存档旧的员工实体。很少查询旧员工实体,应将其排除在与当前员工打交道的任何活动之外。要实现此要求,请将当前表中的活动员工和Archive表中的旧员工存储起来。归档员工需要您从Current表中删除实体并将实体添加到Archive表,但您不能使用EGT执行这两个操作。为避免故障导致实体出现在两个表或两个表中的风险,归档操作必须最终一致。

客户端通过在Azure队列上放置消息来启动存档操作。辅助角色轮询队列以获取新消息;当它找到一个时,它会读取消息并在队列中留下一个隐藏的副本。 worker角色接下来从Current表中获取实体的副本,在Archive表中插入副本,然后从Current表中删除原始副本。最后,如果前面的步骤没有错误,则worker角色会从队列中删除隐藏的消息。

在此示例中,辅助角色将员工插入Archive表。它可以将员工添加到Blob服务中的Blob或文件系统中的文件中。

这种模式的一个重要原则是实际的交易需要是幂等的。创建和删除是幂等的,但更新通常不是。所以他们需要在这种模式中给予额外的关注。

答案 1 :(得分:2)

不可以开箱即用。您需要编写自己的逻辑来实现这一点,这可以很容易地变得非常复杂。