事務能夠一次執行多個命令, 而且帶有如下三個重要的保證:php
事務從開始到執行會經歷如下三個階段:redis
注意:redis事務不支持回滾數組
10.117.8.188:6379> MULTI OK 10.117.8.188:6379> set string4 'string4' QUEUED 10.117.8.188:6379> set string3 'string3' QUEUED 10.117.8.188:6379> del string QUEUED 10.117.8.188:6379> EXEC 1) OK 2) OK 3) (integer) 1
10.117.8.188:6379> MULTI OK 10.117.8.188:6379> del string4 QUEUED 10.117.8.188:6379> del string3 QUEUED 10.117.8.188:6379> DISCARD OK
客戶端2: set string1 '1111' OK 客戶端1: 10.117.8.188:6379> WATCH string1 OK 10.117.8.188:6379> MULTI OK 10.117.8.188:6379> set string1 'string1' QUEUED 10.117.8.188:6379> set string3 'val3' QUEUED 10.117.8.188:6379> EXEC (nil) 因爲string1的值發生變化,事務被打斷,返回nil;
10.117.8.188:6379> UNWATCH OK
命令可能在EXEC調用以後失敗,此時事務中的錯誤不會被處理,事務會繼續往下執行code
$redis->multi(); //$redis->pipeline(); $redis->set('string1','kkk12'); $redis->set('string2','kooo2'); $redis->get('string1'); $res = $redis->exec(); var_dump($res); //返回值: array(3) { [0]=> bool(true) [1]=> bool(true) [2]=> string(5) "kkk12" } // 事務被取消 $redis->multi(); $redis->set('string1','k234'); $redis->set('string2','kooo2'); $redis->get('string1'); $res = $redis->discard(); var_dump($res); //返回值: bool(true)
第一段代碼: $redis->watch('string1'); $redis->multi(); $redis->set('string1','k234'); $redis->set('string2','kooo2'); $redis->get('string1'); sleep(10); $ret = $redis->exec(); var_dump($ret); 第二段代碼: $redis->connect('10.117.8.188',6379); $res = $redis->set('string1','llll1'); var_dump($res); //true 第一段代碼exec未執行以前,執行第二段代碼,等待第一段代碼執行結束,打印$ret:false