redis 事务

redis的事务可以分为两步,定义事务和执行事务。使用multi命令开启一个事务,然后把要执行的所有命令都依次排上去。这就定义好了一个事务。此时使用exec命令来执行这个事务,或使用discard命令来放弃这个事务。

MULTI

开启事务

EXEC

执行事务

  127.0.0.1:9001> multi 
    OK
    127.0.0.1:9001> set a 1
    QUEUED
    127.0.0.1:9001> set a 1 1
    QUEUED
    127.0.0.1:9001> set a 2
    QUEUED
    127.0.0.1:9001> exec
    1) OK
    2) (error) ERR syntax error
    3) OK
    127.0.0.1:9001> get a
    "2"

DISCARD

取消事务

127.0.0.1:9001> multi 
OK
127.0.0.1:9001> set a 3
QUEUED
127.0.0.1:9001> DISCARD
OK
127.0.0.1:9001> get a
"2"

WATCH

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

场景:你可能希望在你的事务开始前,你关心的key不想被别人操作,那么可以使用watch命令来监视这些key,如果开始执行前这些key被其它命令操作了则会取消事务的。也可以使用unwatch命令来取消对这些key的监视。

由于WATCH命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所以我们需要在EXEC执行失败后重新执行整个函数。

127.0.0.1:9001> watch a
OK
127.0.0.1:9001> set a 3
OK
127.0.0.1:9001> multi
OK
127.0.0.1:9001> set a 4
QUEUED
127.0.0.1:9001> exec
(nil)
127.0.0.1:9001> get a
"3"

执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消监控。

127.0.0.1:9001> watch a
OK
127.0.0.1:9001> set a 4
OK
127.0.0.1:9001> unwatch
OK
127.0.0.1:9001> multi
OK
127.0.0.1:9001> set a 5
QUEUED
127.0.0.1:9001> exec
1) OK
127.0.0.1:9001> get a
"5"

redis事务具有以下特点:

1、如果开始执行事务前出错,则所有命令都不执行

2、一旦开始,则保证所有命令一次性按顺序执行完而不被打断

3、如果执行过程中遇到错误,会继续执行下去,不会停止的

4、对于执行过程中遇到错误,是不会进行回滚的

很显然,这并不是我们通常认为的事务,因为它连原子性都保证不了。保证不了原子性是因为redis不支持回滚,不过它也给出了不支持的理由。

不支持回滚的理由:

1、redis认为,失败都是由命令使用不当造成

2、redis这样做,是为了保持内部实现简单快速

3、redis还认为,回滚并不能解决所有问题

你可能感兴趣的:(redis)