如何在事务中执行多个写操作

事务性写入操作指南

前提条件

术语

以下是示例中使用的一些关键术语的定义。

术语定义
etcdctl用于与 etcd 服务器交互的命令行工具。
txn命令txn命令是“事务”的缩写。它从标准输入读取多个 etcd 请求,并将它们作为单个原子事务应用。事务包括条件列表、如果所有条件为真时要应用的请求列表,以及如果任何条件为假时要应用的请求列表。查看etcdctl 键值命令以获取更多信息。
比较在事务(txn)中的compare子句用作条件检查,确定事务的操作是否应继续进行。它确保只有在键值存储的当前状态符合预期条件时才应用更改,从而保持数据一致性并防止并发环境中的冲突。要了解该命令的结构,请查看下面的执行事务部分。

事务

txn在一个事务中处理所有请求:

etcdctl txn --help

etcd 中的事务允许您原子地执行多个操作,确保要么所有操作都应用,要么都不应用。这对于在执行相关更新时保持数据一致性至关重要。请参阅API 文档以了解更多关于事务的信息。

示例

假设您希望在一个事务中更新用户的电子邮件和电话号码。这确保了两个更新一起应用。

05_etcdctl_transaction_2024101213

0. 使用的变量和标志

变量
/users/{<user_id>/email : 表示用户电子邮件地址的 etcd 键。
/users/<user_id>/phone : 表示用户电话号码的 etcd 键。
标志
--interactive : 允许手动输入事务数据的标志

1. 设置初始数据

首先,创建一个带有初始数据的用户。

etcdctl put /users/12345/email "old.address@johndoe.com"
etcdctl put /users/12345/phone "123-456-7890"

2. 执行事务

在一个事务中更新用户的电子邮件和电话号码。

etcdctl txn --interactive

compares:
value("/users/12345/email") = "old.address@johndoe.com"

success requests (get, put, delete):
put /users/12345/email "new.address@johndoe.com"
put /users/12345/phone "098-765-4321"

failure requests (get, put, delete):
get /users/12345/email
  • 比较:检查当前电子邮件是否为“old.address@johndoe.com”。这确保只有在数据符合预期时事务才会继续进行。
  • 成功:如果比较结果为真,则同时更新电子邮件和电话号码。
  • 失败:如果比较失败,则检索当前电子邮件以了解为什么事务没有继续进行。

重要注意事项

  • 原子性:事务确保电子邮件和电话号码一起更新。如果初始条件(比较)不满足,则不会应用任何更新。
  • 一致性: 使用事务可以保持数据的一致性,特别是在处理多个相关更新时。
  • 避免对同一键进行多次写入: 不要在单个事务中对同一键写入多个值,因为这可能导致意外的结果。每个键在单个事务中应仅更新一次。

最后修改于 2025 年 9 月 9 日: 更新 how-to-transactional-write.md (3b2d1c8)