冲突-将Python插入更新到Azure表存储中

时间:2019-08-20 13:59:26

标签: python azure-table-storage insert-update

使用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"}}} 

也许我需要使用全局锁来避免同时操作同一个表实体,但是我不知道如何使用它

2 个答案:

答案 0 :(得分:0)

Azure表存储中没有全局“锁定”,因为它通过 ETag (即原始HTTP请求中的 If-Match 标头)使用乐观并发。

  1. 如果您的线程A执行insert_entity,它将捕获409冲突错误。
  2. 如果线程B和C正在执行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 员工)