Redis学习-11 事物讲解

事物的本质:一组命令的集合!一个事物中的所有命令都会被序列化,在事物执行过程中,会按照顺序执行!

特点:一次性、顺序性、排他性!执行一系列的命令!

Redis事物没有隔离级别的概念!

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

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

redis的事务步骤:

  1. 开启事务(multi)
  2. 命令入队()
  3. 执行事务(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 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

127.0.0.1:6379> multi  #再次开启事务
OK
127.0.0.1:6379>
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  #所以k4为空
(nil)

  • 编译型异常(代码有问题!命令有错!):事务中所有的命令都不会执行!
  • 运行时异常(如1/0):如果事务队列中存在语法错误,那么执行命令的时候,其它命令仍然可以正常执行的。
编译时异常的案例
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 v5 QUEUED 127.0.0.1:6379> exec #执行事务,发现报错 (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k1 #所有的命令都未执行
(nil)

运行时异常的案例
127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr k1 #对一个字符串+1,编译时没有异常 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> exec 1) (error) ERR value is not an integer or out of range #运行时抛出异常,但不影响其它语句的执行 2) OK 3) "v2"
 
原文地址:https://www.cnblogs.com/gslgb/p/13414274.html