# 事务

URL: https://caijiao.org/redis/05-advanced/02-transaction
Source: docs/redis/05-advanced/02-transaction.md
Description: Redis 事务通过 MULTI、EXEC、WATCH 等命令实现多个命令的原子性执行，保证数据操作的一致性，适用于需要批量处理的场景。

Redis 事务是一组按顺序执行的命令，确保这些命令要么全部成功执行，要么全部不执行。事务通过 `MULTI`、`EXEC` 等命令实现原子性操作。

## 主要命令

- **MULTI**：标记事务的开始，后续的命令将被排队，直到执行 `EXEC`。

```bash
MULTI
````

* **EXEC**：执行事务队列中的所有命令，如果其中一个命令执行失败，其他命令仍然会被执行。

```bash
EXEC
```

* **DISCARD**：放弃事务，清空命令队列，不执行任何命令。

```bash
DISCARD
```

* **WATCH**：监视某个或多个键，当被监视的键发生变化时，事务会失败。

  ```bash
  WATCH key [key ...]
  ```

## 工作流程

1. 事务通过 `MULTI` 命令开始。
2. 向 Redis 发送多个命令，这些命令会进入事务队列，但不会立即执行。
3. 执行 `EXEC` 命令时，所有命令会按顺序执行。如果没有发生错误，事务会提交执行。
4. 如果有任何键被 `WATCH` 监控，并且在事务执行之前这些键的值发生了变化，事务将自动失败。

## 特点与限制

* **原子性**：事务中的所有命令要么都成功执行，要么都不执行。
* **隔离性**：事务中的命令在被执行前不会被其他客户端的命令影响，直到 `EXEC` 被调用。
* **没有回滚机制**：一旦事务开始，所有命令会按顺序执行，不能回滚。

## 注意事项

* 事务执行期间，Redis 会依次执行每个命令，但不保证命令执行的时序顺序（例如并发写操作时）。
* 事务中的命令是批量执行的，但如果在执行期间发生错误，事务中的所有命令都会执行。
* 使用 `WATCH` 可以监控某个键的变化，确保在执行事务前该键未被其他客户端修改。

## 应用场景

适用于需要保证操作原子性的一系列命令场景，如用户余额扣款、订单处理、批量更新等，确保在高并发环境下数据一致性。
