You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
# 一、介绍
|
|
|
|
|
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之前盯住关键变量**
|