NOTE
1.4 Redis事务
1. Redis事务是什么 - 一步执行一组命令,有两点保证: - 事务中的所有指令是顺序执行的。也就是说执行这一组指令的过程中,其他客户端看不到中间状态 - 原子性。即所有命令要么都会执行,要么都不被执行。但是 如果中途有一个命令执行失败了,那么之前执行的命令不会回滚 2. Redis事务使用 2
这是历史学习笔记,可能存在过时或不完整的理解。
1. Redis事务是什么
- 一步执行一组命令,有两点保证:
- 事务中的所有指令是顺序执行的。也就是说执行这一组指令的过程中,其他客户端看不到中间状态
- 原子性。即所有命令要么都会执行,要么都不被执行。但是如果中途有一个命令执行失败了,那么之前执行的命令不会回滚
2. Redis事务使用
2.1. 执行与取消事务
2.1.1. 执行事务
# 2. 开始事务
multi
# 3. 命令
set age 30
get age
get name
# 4. 提交事务
exec

2.1.2. 取消事务
# 开始事务
multi
# 命令
set age 30
get age
get name
# 取消事务
discard

2.2. exec才会真正执行事务
由下面的例子可以看出会话1exec前并没有对数据库造成更改

2.3. Redis的事务不会回滚
-
语法错误事务不会执行,谈不上回滚

-
语义错误事务也不会回滚已经执行过的指令,并且还会继续往下执行

3. 使用Redis事务实现乐观锁
- client1
watch name
multi
set age 111
get age
#等待client2
exec
- client2
set name wsy
当client2改变name之后,client1在执行exec会返回nil,即没有执行成功
4. Redis事务 vs MySQL事务
- MySQL事务满足ACID,而Redis只满足I
- A:Redis一组语句,如果中间有一个执行出现不会回滚
- C:一致性由程序员和A+I保证,A不满足
- D:Redis持久化会丢失1s数据
| Mysql | Redis | |
|---|---|---|
| 开启 | start transaction | muitl |
| 语句 | 普通sql | 普通命令 |
| 失败 | rollback 回滚 | discard 取消 |
| 成功 | commit | exec |
-
rollback与discard 的区别 如果已经成功执行了2条语句, 第3条语句出错. Rollback后,前2条的语句影响消失. Discard只是结束本次事务,前2条语句造成的影响仍然还在
-
在mutil后面的语句中, 语句出错可能有2种情况
-
语法就有问题, 这种exec时报错, 所有语句得不到执行
-
语法本身没错,但适用对象有问题. 比如 zadd 操作list对象 Exec之后会执行正确的语句,并跳过有不适当的语句.
5. Redis事务执行流程
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。