Redis-04-事务

Redis-04-事务

Redis单条命令是保证原子性的,但是事务不保证原子性!

所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!(Exec)

Redis事务没有隔离级别的概念

一个事务中的所有命令都会被序列化,在序列执行的过程中,会按照顺序执行!

  • 一次性
  • 顺序性
  • 排他性
1
2
### Redis事务本质:一组命令的集合
--- 队列 set set set 执行 ---

Redis事务分为三个阶段:

  • 开启事务(MULTI -)
  • 命令入队(………….)
  • 执行事务(Exec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> MULTI   ## 开启事务
OK
## 命令入队
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
## 执行事务
127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"
4) OK

放弃事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> multi ## 开启事务
OK

127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED

## 取消事务
127.0.0.1:6379> discard
OK
## 事务队列中的命令都不会被执行
127.0.0.1:6379> get k4
(nil)

编译型异常(代码有问题!)

  • 事务中所有的命令都不会被执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec ## 执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5 ## 所有的命令都不会被执行
(nil)

运行时异常(1/0)

  • 如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是依旧可以正常执行的!(错误命令抛出异常)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1 ## 执行的时候会失败
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec ## 其他命令是依旧可以正常执行的
1) (error) ERR value is not an integer or out of range ## 虽然第一条命令报错了
2) OK
3) OK
4) "v3"
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信