一:简介
Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成,redis实现事务实现的机制与常见的关系型数据库有很大的却别,比如redis的事务不支持回滚,事务执行时会阻塞其它客户端的请求执行。
二:事务实现细节
redis事务从开始到结束通常会通过三个阶段:
1.事务开始
2.命令入队
3.事务执行
我们从下面的例子看下
redis> MULTI
OK
redis > SET "username" "bugall"
QUEUED
redis > SET "password" 161616 QUEUED redis > GET "username" redis > EXEC 1) ok 2) "bugall" 3) "bugall"
redis >MULTI
标记事务的开始,MULTI命令可以将执行该命令的客户端从非事务状态切换成事务状态,这一切换是通过在客户端状态的flags属性中打开REDIS_MULTI标识完成,我们看下redis中对应部分的源码实现
void multiCommand(client *c) {
if (c->flags & CLIENT_MULTI) {
addReplyError(c,"MULTI calls can not be nested"); return; } c->flags |= CLIENT_MULTI; //打开事务标识 addReply(c,shared.ok); }
在打开事务标识的客户端里,这些命令,都会被暂存到一个命令队列里,不会因为用户会的输入而立即执行
redis> SET "username" "bugall"
redis > SET "password" 161616 redis >