文档版本 v3.7-DRAFT 处于 草稿 状态。如需获取最新的稳定版文档,请参阅 v3.6。
如何在事务中执行多个写操作
事务性写入操作指南
前提条件
- 安装
etcd和etcdctl。 - 一个正在运行的
etcd集群。
术语
以下是示例中使用的一些关键术语的定义。
| 术语 | 定义 |
|---|---|
| etcdctl | 用于与 etcd 服务器交互的命令行工具。 |
txn命令 | txn命令是“事务”的缩写。它从标准输入读取多个 etcd 请求,并将它们作为单个原子事务应用。事务包括条件列表、如果所有条件为真时要应用的请求列表,以及如果任何条件为假时要应用的请求列表。查看etcdctl 键值命令以获取更多信息。 |
比较 | 在事务(txn)中的compare子句用作条件检查,确定事务的操作是否应继续进行。它确保只有在键值存储的当前状态符合预期条件时才应用更改,从而保持数据一致性并防止并发环境中的冲突。要了解该命令的结构,请查看下面的执行事务部分。 |
事务
txn在一个事务中处理所有请求:
etcdctl txn --help
etcd 中的事务允许您原子地执行多个操作,确保要么所有操作都应用,要么都不应用。这对于在执行相关更新时保持数据一致性至关重要。请参阅API 文档以了解更多关于事务的信息。
示例
假设您希望在一个事务中更新用户的电子邮件和电话号码。这确保了两个更新一起应用。
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”。这确保只有在数据符合预期时事务才会继续进行。
- 成功:如果比较结果为真,则同时更新电子邮件和电话号码。
- 失败:如果比较失败,则检索当前电子邮件以了解为什么事务没有继续进行。
重要注意事项
- 原子性:事务确保电子邮件和电话号码一起更新。如果初始条件(比较)不满足,则不会应用任何更新。
- 一致性: 使用事务可以保持数据的一致性,特别是在处理多个相关更新时。
- 避免对同一键进行多次写入: 不要在单个事务中对同一键写入多个值,因为这可能导致意外的结果。每个键在单个事务中应仅更新一次。