Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令,若需要撤销队列中的所有命令也可以使用discard命令执行撤销。
试验1.启动并执行一个批处理(事务)
redis 127.0.0.1:6379> mget name age //读取键的值
1) "zhangsan"
2) "22"
redis 127.0.0.1:6379> multi //启动批处理
OK
redis 127.0.0.1:6379> set name lisi //设置name值
QUEUED
redis 127.0.0.1:6379> set age 25 //设置age值
QUEUED
redis 127.0.0.1:6379> incr age //运算age值
QUEUED
redis 127.0.0.1:6379> exec //通过exec提交 处理
1) OK
2) OK
3) (integer) 26
redis 127.0.0.1:6379> mget name age //查看结果 执行成功
1) "lisi"
2) "26"
试验2.取消一个批处理(事务)
redis 127.0.0.1:6379> mget name age
1) "lisi"
2) "26"
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set name wangwu
QUEUED
redis 127.0.0.1:6379> set age 28
QUEUED
redis 127.0.0.1:6379> discard //使用discard取消批处理 回滚
OK
redis 127.0.0.1:6379> mget name age //查看结果 没有执行
1) "lisi"
2) "26"
试验3.redis的批处理(事务)的不成熟性
redis 127.0.0.1:6379> mget name age
1) "lisi"
2) "26"
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr name
QUEUED
redis 127.0.0.1:6379> incr age
QUEUED
redis 127.0.0.1:6379> exec //提交执行
1) (error) ERR value is not an integer or out of range //试图字符串自增运算 报错属正常
2) (integer) 27 //整型自增运算 成功
redis 127.0.0.1:6379> mget name age //查看结果
1) "lisi" //执行失败的
2) "27" //age却被提交执行了??
注:一个成熟的事务应该只要有一个命令执行失败整个事务均会回滚,但此处age却执行了,待完善!