redis事务管理

1. 说明

rdis是单线程,提交命令时,其它命令无法插入其中,轻松利用单线程实现了实务的原子性。

如果执行多个redis命令,事务就无法保证,于是redis有下列相关的redis命令来实现事务管理。

------------------------------------------------------------------------------------------------------------------

multi      开启事务

exec       提交事务

discard       取消事务

watch      监控,如果监控的值发生变化,则提交事务时会失败

unwatch       去掉监控

------------------------------------------------------------------------------------------------------------------

Redis保证一个事务的所有命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,

则redis会清空事务队列,事务中的所有命令都不会执行。

而一旦客户端发送了EXEC命令,所有的命令都会被执行,即使此后客户端断线也没有关系,因为

redis中已经记录了所有要执行的命令。

 

2.1  exec提交事务

  

  例如:模拟转账,王有200,张有700,张给王转100。过程如下:

 

    set w 200

 

    set z 700

 

    mget w z

 

    multi

 

      decrby z 100   #注意此命令根本没有执行,而是把其放在一个队列中

 

      incrby w 100

 

      mget w z

 

      get w           #同时,这些相关的变量也不能再读取

 

      get z

 

    exec

 

 

 

2.2 如果有错误命令,自动取消

 

   mget w z

 

    1) "300"

 

    2) "600"

 

   multi

 

     get w

 

     set w 100

 

     abc

 

    (error) ERR unknown command 'abc'

 

   exec

 

    (error) EXECABORT Transaction discarded because of previous errors.

 

    get w

 

 

2.3    discard取消事务(注意redis事务太简单,没有回滚,而只有取消)

 

   mget z w

 

    1) "600"

 

    2) "300"

 

  multi

 

   incrby z 100

 

  discard

 

   get z

 

   exec

 

  (error) ERR EXEC without MULTI

 

 

 

posted @ 2017-10-22 21:15  bruce.chen  阅读(321)  评论(0)    收藏  举报