↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

etcd 3.7

如何在事务中进行多次写操作

etcd 3.7 开发、运维、升级、API 与内部原理中文指南

先决条件

术语

以下是本文中使用的部分关键术语的定义,这些术语将在 Example 示例中出现。

术语 定义
etcdctl 用于与 etcd 服务器交互的命令行工具。
txn 命令 txn 命令是“事务”的缩写。它从标准输入读取多个 etcd 请求,并将其作为单个原子事务执行。事务包含一组条件、一组在所有条件均为真时执行的请求,以及一组在任一条件为假时执行的请求。有关更多信息,请参阅 etcdctl 键值命令 。
compare 事务(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
  • Compare:检查当前邮箱是否为 “old.address@johndoe.com "。这确保事务仅在数据符合预期时才继续执行。
  • Success:如果比较结果为真,更新邮箱和电话号码。
  • Failure:如果比较失败,获取当前邮箱以了解事务未执行的原因。

重要考虑事项

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

文档取自 pig.center · 上游文档

版本
3.7
许可
CC-BY-4.0
来源修订
dba8dc7e1afd3f6eea300ebf9ecb67c731145f1ee7db1ca0d3ebc49508812609
译文修订
dba8dc7e1afd3f6eea300ebf9ecb67c731145f1ee7db1ca0d3ebc49508812609
原始 Markdown