标签 - NoSQL

Redis NoSQL    2016-06-19 00:58:32    409    0    0

Redis事务的实现

  1. redis的事务通过MULTI,EXEC,WATCH,DISCARD等命令实现。
  2. Redis通过MULTI命令开启事务,通过EXEC提交事务,通过DISCAR放弃事务
  3. Redis事务执行的结果会按顺序返回给客户端。
    Redis事务一般包含三个阶段
    1)开始事务
    2)命令入队
    3)事务执行

开始事务

通过MULTI命令开始事务,MULTI命令把执行该命令的客户端从非事务态转为事务态。该命令服务端始终返回OK

命令入队

开启事务之后,客户端向服务端发送的命令不会被立即执行,服务端会将这些命令放入一个事务队列,同时响应给客户端QUEUED。

命令执行

客户端向服务端发送EXEC命令之后,服务端事务队列中的事务会被按顺序执行 ,最后执行命令所得结果全部返回客户端 。

Redis事务的特性

数据库事务的ACID特性在Redis中是否都满足呢?

原子性

Redis事务满足原子性。事务队列中的命令要么全部执行,要么全部放弃。
需要注意的是,如果在事务队列中的命令执行的时候,某些命令执行出错,那么也不会影响其他命令的执行。比如命令A,B,C,D是在一个事务中,假如B执行出错了,那么ACD三个命令依然会执行,并且执行结果也会生效。这一点与MySQL等关系型数据库不同,原因在于Redis事务不支持回滚,而不支持回滚的原因是Redis的开发者认为这会使redis复杂。

隔离型

Redis是单线程的,并且服务端保证在执行事务期间不会对事务进行中断,所以Redis的事务总是以串行方式运行的,所以,Redis的事务也是具有隔离性的。

一致性

数据库的一致性指的是数据库中数据的状态变化总是从一个一致性的状态变化到另外一个一致性的状态。即事务执行前是一致的,事务执行之后,状态也应该是一致的。
Redis事务也具备一致性,从以下三个方面进行保证:

入队错误

事务开启后,如果一个命令入队时出错(比如命令的参数个数不对或者命令不存在),那么收到客户端的EXEC命令之后,Redis将拒绝执行事务。
PS:入队错误,不会返回给客户端QUEUED,所以客户端可以知道命令出错,最后通