gpt4 book ai didi

python-2.7 - Azure 存储表 [Python] - 批处理不会失败

转载 作者:行者123 更新时间:2023-12-03 01:55:21 24 4
gpt4 key购买 nike

我目前正在开发一个 Python (2.7) 应用程序,该应用程序通过 Azure Python 包使用 Azure 表存储服务。据我从 Azure 的 REST API 了解到,批处理操作会创建原子事务。因此,如果其中一个操作失败,则整个批处理都会失败并且不会执行任何操作。

我遇到的问题如下:下面的方法通过“rows”参数接收字典列表。有些有一个 ETag 集(由之前的查询提供)。

如果设置了ETag,则尝试合并操作。否则,尝试插入操作。由于多个进程可能会修改同一个实体,因此需要通过merge_entity函数的“if_match”参数来解决并发问题。如果合并/插入操作是单独的操作(不包含在批处理中),则系统按预期工作,如果 ETag 不匹配,则会引发异常。不幸的是,如果它们包含在“begin_batch”/“commit_batch”调用中,则不会发生这种情况。即使 ETag 不匹配,实体也会(错误地)合并。

我在下面提供了所使用的代码和测试用例。还进行了多次手动测试,得出了相同的结论。

我不确定如何解决这个问题。是我做错了什么还是Python包有问题?

使用的代码如下:

def persist_entities(self, rows):
success = True
self._service.begin_batch() #If commented, works as expected (fails)
for row in rows:
print row
etag = row.pop("ETag")
if not etag:
self._service.insert_entity(self._name,
entity=row)
else:
print "Merging " + etag
self._service.merge_entity(self._name,
row["PartitionKey"],
row["RowKey"],
row, if_match=etag)
try: #Also tried with the try at the begining of the code
self._service.commit_batch() #If commented, works as expected (fails)
except WindowsAzureError:
print "Failed to merge"
self._service.cancel_batch()
success = False
return success

使用的测试用例:

def test_fail_update(self):
service = self._conn.get_service()
partition, new_rows = self._generate_data() #Partition key and list of dicts
success = self._wrapper.persist_entities(new_rows) #Inserts fresh new entity
ok_(success) #Insert succeeds
rows = self._wrapper.get_entities_by_row(partition) #Retreives inserted data for ETag
eq_(len(rows), 1)
for index in rows:
row = rows[index]
data = new_rows[0]
data["Count"] = 155 #Same data, different value
data["ETag"] = "random_etag" #Change ETag to a random string
val = self._wrapper.persist_entities([data]) #Try to merge
ok_(not val) #val = True for merge success, False for merge fail.
#It's always True when operations in batch. False if operations out of batch
rows1 = self._wrapper.get_entities_by_row(partition)
eq_(len(rows1), 1)
eq_(rows1[index].Count, 123)
break

def _generate_data(self):
date = datetime.now().isoformat()
partition = "{0}_{1}_{2}".format("1",
Stats.RESOLUTION_DAY, date)
data = {
"PartitionKey": partition,
"RowKey": "viewitem",
"Count": 123,
"ETag": None
}
return partition, [data]

最佳答案

这是 SDK(v0.8 及更早版本)中的一个错误。我创建了一个问题并检查了修复。它将成为下一个版本的一部分。您可以从 git 存储库 pip install 来测试修复。 https://github.com/Azure/azure-sdk-for-python/issues/149

关于python-2.7 - Azure 存储表 [Python] - 批处理不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22987752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com