使用Python,我有很多过程需要使用
同时将数据更新/插入到Azure表存储中。table_service.update_entity(table_name, task) <br/>
table_service.insert_entity(table_name, task)
但是,发生以下错误:
<br/>AzureConflictHttpError: Conflict
{"odata.error":{"code":"EntityAlreadyExists","message":{"lang":"en-US","value":"The specified entity already exists.\nRequestId:57d9b721-6002-012d-3d0c-b88bef000000\nTime:2019-01-29T19:55:53.5984026Z"}}}
也许我需要使用全局锁来避免同时操作同一个表实体,但是我不知道如何使用它
答案 0 :(得分:0)
Azure表存储中没有全局“锁定”,因为它通过 ETag (即原始HTTP请求中的 If-Match 标头)使用乐观并发。
insert_entity
,它将捕获409冲突错误。update_entity
,则它们应该出现412 Precondition Failed错误,并使用循环来检索最新实体,然后尝试再次更新该实体。有关更多详细信息,请检查https://azure.microsoft.com/en-us/blog/managing-concurrency-in-microsoft-azure-storage-2/
中表服务中的并发管理部分。答案 1 :(得分:0)
Azure Tables 有一个 new SDK 可用于 Python,它在 pip 上提供预览版本,这是最新库的更新。
在 create 方法中,您可以使用 sp: 'azure-spn'
块来捕获预期的错误:
try/except
您可以使用 from azure.data.tables import TableClient
from azure.core.exceptions import ResourceExistsError
table_client = TableClient.from_connection_string(conn_str, table_name="myTableName")
try:
table_client.create_entity(entity=my_entity)
except ResourceExistsError:
print("Entity already exists")
在创建后有条件地更新实体。
ETag
更新时,您可以选择替换或合并,更多信息here。
(仅供参考,我是 Azure SDK for Python 团队的 Microsoft 员工)