This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# 一、介绍
redis提供了不完整的事务,有3个命令
multi 开启事务,相当于begin
exec 执行事务,相当于commit
discard 回滚,相当于rollback
使用方法如下图所示
QUEUED是一个提示字符串,和OK相同,表示指令已经被服务器缓存到队列里了
![[Snipaste_2023-02-24_14-42-21.png]]
# 二、原子性
事务的原子性是指事务要么全部成功,要么全部失败,redis的事务不具备原子性,因为它在遇到指令执行失败后,后面的指令还会继续执行。
redis仅仅是满足了事务隔离性中的串行化(当前执行的事务有着不被其他事务打断的权利)
# 三、使用
一般事务和管道是一起使用的,这样可以将多次IO操作压缩为单次IO操作。
重点:多线程事务,redis提供了watch机制(一种乐观锁)用于解决并发修改问题
watch会在事务开始之前盯住一个或多个关键变量,当事务执行时(服务器收到exec指令要顺序执行缓存的事务队列时),Redis会检查关键变量自watch之后是否被修改(包括当前事务所在的客户端)。如果关键变量被修改,exec指令就会返回NULL回复客户端事务执行失败,这个时候客户端可以选择重试。
**禁止在multi和exec之间执行watch指令,必须在multi之前盯住关键变量**