Redis学习 -- Redis的事务
一、什么是Redis的事务
关于事务,我们常熟知的是mysql的事务,即隔离性、持久性、原子性、一致性。
而Redis的事务呢?
我们知道,redis单条命令是保证原子性的,但是redis的事务并不能保证原子性。
redis事务通俗的来说,就是一组命令的集合,一次性执行。一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行。
redis事务中没有隔离级别的概念。
创建事务后,事务中的命令都会按顺序入队列,但这时并没有被执行!而是在发起执行事务命令时才会按顺序执行事务中的命令!
redis事务命令的过程:
- 创建事务(multi命令)
- 命令入队
- 执行事务(exec命令)
二、创建事务并执行
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"
三、放弃事务
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、编译型异常
这里我们可以得出结论,如果是编译型异常,那么事务中的所有命令都不会被执行!
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的事务没有原子性,即要么都失败,要么都成功。这点和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"