如何使用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
相关产品推荐
相关产品推荐

