事务
multi - exec ;中间的命令会依次执行。
multi
sadd "user:1:following" 2
sadd "user:2:followiers" 1
exec
异常处理
1、语法错误.下面命令只有第一个是正确的,其余两个是错误的,编译不通过,整个事务都不会执行
multi
set key value
set key
(error)
errorCommand key
(error)
exec
2、运行错误;执行之前redis无法发现错误,运行时错误。下面的例子中,sadd key 2 是一个错误的命令,但只有执行的时候才会报错,但是不会影响事务继续进行。所有set key 3也会执行。最后的结果是3
multi
set key 1
sadd key 2
(error)
set key 3
exec
get key
(3)
watch 命令
情景介绍:事务中每个命令执行结果都是最后一起返回的,所以无法将前一个命令的结果作为下一条命令的参数。 为了解决这个问题,我们可以在get键值后保证该键值不被其他客户端修改,知道函数执行完成后才允许其他客户端修改该键值,这样可以防止竞太条件。watch命令可以监控一个或者多个键。一旦其中有一个键被修改,之后的事务就不会执行。监控一直持续到exec命令
set key 1
watch key
set key 2
multi
set key 3
exec
get key
(2)
可以使用watch 来通过事务实现incr函数。伪代码:
def incr($key)
watch $key
$value = get $key
if not $value
$value = 0
$value = $value+1
MULTI
set $key,$value
result = exec
return result[0]
watch 命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行。而不能保证其他客户端不修改这一键值。
也可以使用 unwatch 命令来取消监控。比如:实现hsetxx函数,仅当字段存在时才赋值
def hsetxx($key,$field,$value)
watch $key
$isFieldExists = HEXISTS $key,$field
if $isFieldExists is 1
multi
hset $key ,$field,$value
exec
else
unwatch
return $isFieldExists