Redis学习(四) -- Redis的事务

Redis学习 -- Redis的事务

一、什么是Redis的事务

关于事务,我们常熟知的是mysql的事务,即隔离性、持久性、原子性、一致性。
而Redis的事务呢?
我们知道,redis单条命令是保证原子性的,但是redis的事务并不能保证原子性。
redis事务通俗的来说,就是一组命令的集合,一次性执行。一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行。
redis事务中没有隔离级别的概念。
创建事务后,事务中的命令都会按顺序入队列,但这时并没有被执行!而是在发起执行事务命令时才会按顺序执行事务中的命令!
redis事务命令的过程:

  1. 创建事务(multi命令)
  2. 命令入队
  3. 执行事务(exec命令)

二、创建事务并执行

Redis学习(四) -- Redis的事务

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 k1
QUEUED
127.0.0.1:6379> exec # 执行事务,这里的返回结果依次就是事务中的命令按顺序执行的结果
1) OK
2) OK
3) "v1"

三、放弃事务

Redis学习(四) -- Redis的事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> get k4
(nil)

四、事务中的异常

这里我们根据Java中的分类,即编译型异常和运行时异常来测试。

1、编译型异常

Redis学习(四) -- Redis的事务
这里我们可以得出结论,如果是编译型异常,那么事务中的所有命令都不会被执行!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> getset k5
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

2、运行时异常

Redis学习(四) -- Redis的事务
这里我们可以得出结论,运行时异常的话,redis的事务执行,只有命令执行异常的那条命令没有执行,其余正常的命令都被执行了,由此可见,redis的事务没有原子性,即要么都失败,要么都成功。这点和mysql的事务不一样!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k7 a
QUEUED
127.0.0.1:6379> incr k7
QUEUED
127.0.0.1:6379> set k8 v8
QUEUED
127.0.0.1:6379> get k8
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "v8"

上一篇:SQL解析器之词法分析--预扫描


下一篇:Spring Cloud云服务架构 - commonservice-eureka 项目过程构建