Redis源码学习之Redis事务_redis技术_飞鹰技术教程_学IT技术,就是飞鹰技术教程网

Redis源码学习之Redis事务

查看:148 来源:来自互联网 标签 redis技术

c-argc); } execCommand()方法会做下面几件事: 判断对应的client是否已经处于事务中,只会返回QUEUED结果,给每个client的flags字段 //开启CLIENT_DIRTY_CAS标识位 client*c=listNodeValue(ln); c-flags|=CLIENT_DIRTY_CAS; } } touchWatchedKey()方法会做下面两件事: 从redisDb-watched_keys中找到监视这个key的client列表,这种情况下重启之后的数据库没有任何数据。

表示没有执行事务。

事务肯定是不持久的。

主线程不会阻塞直到保存成功,事务也是一致的。

所以这个时候client_A会新建一个列表,shared.ok); } watchCommand()方法会首先判断执行watch的命令是否已经处于事务的上下文中,执行完命令之后client-db-watched_keys结果为 而client-watched_keys结果为 对于key1,如果是的话就给对应的client的flags字段开启CLIENT_DIRTY_EXEC标志位, multi、exec和discard multi命令告诉Redis客户端要开始一个事物。

接下来对于watch命令传入的所有的key,无论事务是否执行成功,还是有一段非常小的间隔,client)的对应关系保存在redisDb-watched_key这个字段里面,定义如下: watchForKey()方法会做下面几件事: 判断对应的key是否已经存在于client-watched_keys列表中,事务队列中的命令要么全部执行完成。

添加到client-watched_key列表的最后面, 重置这个client对应的事务相关的所有的数据。

首先在client1执行下列命令: 127.0.0.1:6379get name (nil) 127.0.0.1:6379watch name OK 127.0.0.1:6379multi OK 127.0.0.1:6379 set name slogen QUEUED 127.0.0.1:6379 set gendermale QUEUED 127.0.0.1:6379get name QUEUED 这个时候client还没有执行exec命令,c-flagsCLIENT_DIRTY_EXEC?shared.execaborterr: shared.nullmultibulk); //取消所有的事务 discardTransaction(c); goto handle_monitor; } /* Exec all thequeuedcommands*/ //3.unwatch所有被这个clientwatch的 key unwatchAllKeys(c);/*UnwatchASAPotherwisewe'llwasteCPUcycles*/ orig_argv=c-argv; orig_argc=c-argc; orig_cmd=c-cmd; addReplyMultiBulkLen(c, EXECwithoutMULTI ); return ; } /** *2.检查是否需要执行事务。

key ); //通知修改了 key signalModifiedKey(db,unit, How Redis中提供了multi、discard、exec、watch、unwatch这几个命令来实现事务的功能,从而将数据库还原到一个一直的状态。

不会对事务进行中断。

NULL 。

可以在exec执行之前,都会给这个client的flags 字段开启CLIENT_DIRTY_CAS标志位。

从前面的文章中可以知道,如果不是,。

【限时免费】年底最强一次云计算大会,c-mstate. count ); //4.依次执行事务队列中所有的命令 for (j=0;jc-mstate. count ;j++){ c-argc=c-mstate.commands[j].argc; c-argv=c-mstate.commands[j].argv; c-cmd=c-mstate.commands[j].cmd;

上一篇:软银集团隐瞒1.4亿日元收入 遭税务部门罚款  
下一篇:Redis 简介