任何数据库都要有一套本身的事务控制机制,redis事务是一次能够执行多个命令,它的本质是一组命令的集合。一个事务中全部的命令都会被序列化,在事务执行的过程当中会按照顺序执行队列中的命令。其它客户端提交的命令请求会等到事务执行完毕再执行。redis
总的来讲:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令,因此Redis实战笔记你得先看懂!数据库
一、redis事务是分为三个阶段:开始事务、命令入队、执行事务。缓存
二、redis事务不具备隔离级别的概念:redis在发送exec命令以前,命令操做只是被放入到队列缓存当中,并不会被实际执行,所以也就不能相似关系型数据中,在事务内查询已经变动的操做,事务外的客户端更不能查询到事务内的数据。ide
三、redis事务是不保证原子性的:redis事务只保证在命令格式只有在都正确的状况下才会都执行,要不就都不执行命令。可是事务的总体是不保证原子性的,且没有回滚,当事务中任意一个命令执行失败,其他的命令依然会执行。测试
一、watch key1 key2等等:监视一个或者多个KEY,若是在事务执行的时候,key的值被其它命令改动,则事务被打断,所有不执行,redis经过该机制完成事务的乐观锁。3d
二、multi:用于指定redis事务的开始。code
三、exec:用于指定redis事务开始执行(顺序、一次性执行全部事务中的命令),一旦执行exec,前面加的监控锁都会被取消。blog
四、discard:用于取消事务。放弃事务中的全部命令。队列
五、unwatch:取消对watch中key的监控。事务
下面咱们经过实例来详细分析redis事务的执行过程:
multi set key1 hello set key2 free set key3 world get key2 exec
multi set key1 hello_1 set key2 free_1 set key3 world_1 discard get key3
multi set key1 hello_1 setok key2 free_1 set key3 world_1 get key3 exec
multi incr key1 set key2 free_1 set key3 world_1 get key3 exec
首先添加测试数据,代码以下:
set keya 100 set keyb 20 watch keya multi decrby keya 50 incrby keyb 50 exec get keya
而后,咱们打开第二个客户端,在事务执行(exec)以前,对a帐户提早减小50块钱,看下watch的乐观锁机制是否生效,代码以下:
在redis事务提交时,若是在事务进入缓存队列的过程当中,watch命令监控key的值发生了变化,则事务中的命令将都不会被执行。同时返回<nil>提示事务使用者事务执行失败。