You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Azure.Data.Tables.TableClient执行多记录更新事务?

Azure.Data.Tables SDK 事务批量操作实现方法

前置约束

Azure Tables的事务有强制限制,需先满足才能使用:

  • 事务内所有操作对应的实体必须使用相同的分区键(PartitionKey)
  • 单个事务最多包含100个操作,总数据大小不能超过4MB
  • 同一个实体不能在单个事务中被多次操作
  • 事务为原子性操作,所有操作要么全部成功,要么全部回滚

实现步骤

1. 安装依赖包

首先安装对应NuGet包,包名为Azure.Data.Tables,可直接通过NuGet包管理器安装,或在项目文件中引入对应版本。

2. 初始化TableClient实例

首先构造TableClient对象,用于后续操作:

// 替换为你的存储账户连接字符串、目标表名
var connectionString = "你的Azure存储账户连接字符串";
var tableName = "目标表名";
var tableClient = new TableClient(connectionString, tableName);
// 确保表已存在
await tableClient.CreateIfNotExistsAsync();

3. 构造事务操作集合

使用List<TableTransactionAction>集合添加需要批量执行的操作,支持新增、更新、删除等不同操作类型:

// 示例自定义实体,需实现ITableEntity接口
public class Product : ITableEntity
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
    // 自定义字段
    public string ProductName { get; set; }
    public int Stock { get; set; }
}

// 构造事务操作列表,所有实体PartitionKey必须相同
var transactionActions = new List<TableTransactionAction>();

// 添加新增操作
var newProduct = new Product
{
    PartitionKey = "Electronics",
    RowKey = "P001",
    ProductName = "无线耳机",
    Stock = 100
};
transactionActions.Add(new TableTransactionAction(TableTransactionActionType.Add, newProduct));

// 添加更新操作(替换原有实体)
var updateProduct = new Product
{
    PartitionKey = "Electronics",
    RowKey = "P002",
    ProductName = "智能手表",
    Stock = 50
};
// 如果需要仅更新部分字段,可使用TableTransactionActionType.UpdateMerge
transactionActions.Add(new TableTransactionAction(TableTransactionActionType.UpdateReplace, updateProduct));

// 添加删除操作
var deleteProduct = new Product
{
    PartitionKey = "Electronics",
    RowKey = "P003",
    ETag = ETag.All // 如需乐观锁校验可替换为对应实体的ETag值
};
transactionActions.Add(new TableTransactionAction(TableTransactionActionType.Delete, deleteProduct));

4. 提交事务

调用SubmitTransactionAsync方法提交事务,处理执行结果:

try
{
    Response<IReadOnlyList<Response>> transactionResponse = await tableClient.SubmitTransactionAsync(transactionActions);
    // 事务提交成功,transactionResponse中包含每个操作的对应返回结果
    Console.WriteLine("事务批量操作执行成功");
}
catch (TableTransactionFailedException ex)
{
    // 事务提交失败,所有操作已回滚
    // ex.FailedActionIndex属性可获取导致失败的操作在集合中的索引
    Console.WriteLine($"事务执行失败,失败操作索引:{ex.FailedActionIndex},错误信息:{ex.Message}");
}

常见操作类型说明

  • TableTransactionActionType.Add:新增实体,若实体已存在则操作失败
  • TableTransactionActionType.UpsertReplace:实体存在则替换,不存在则新增
  • TableTransactionActionType.UpsertMerge:实体存在则合并字段,不存在则新增
  • TableTransactionActionType.UpdateReplace:全量替换已有实体,实体不存在则操作失败
  • TableTransactionActionType.UpdateMerge:合并更新已有实体的部分字段,实体不存在则操作失败
  • TableTransactionActionType.Delete:删除指定实体

内容的提问来源于stack exchange,提问作者AlvinfromDiaspar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:18:05