node.js - Redis-node库丢弃事务

标签 node.js transactions redis

实际上,我正在使用优秀的库 redis-node。 但是,我不知道如何使以下情况起作用:

我有一个由参数传递的数量字段,然后,在一个 for 循环中,我需要使用 LPOP 从第一个列表中提取项目,然后 RPUSH 到另一个列表中,数量必须相同,都在一个交易区 block 。

那么,如果数量参数和提取的项目不同,我不想丢弃交易,这可能吗?

我放了一段我现在的代码。

var redisNode = require('redis-node');
var client = redisNode.createClient();
var qty = req.params.qty;

// init transaction, lpop first and rpush finally
client.transaction(function () {
   for (var i=0; i <= qty; i++) {
       client.lpop(initStockListKey, function (err, item) {                        
           if (err) throw err;
           console.log('[assign] CREATE TRANSACTION list %s, pop %s', initStockListKey, item);  
           inProgressItems.push(item);
       });
   }

   // pop qty validation, DISCARD
   if (inProgressItems.length != qty) {
       client.discard(function (err, status) {
           console.log('[assign] DISCARD TRANSACTION err %s status %s', err, status);  
       })
   }       
});

运行此代码时出现以下错误:

ERR EXEC without MULTI

最佳答案

您没有以正确的方式使用 MULTI。检查在库的 GitHub repository 中找到的以下 node_redis 文档示例:

var redis  = require("redis"),
    client = redis.createClient(), multi;

// start a separate multi command queue
multi = client.multi();
multi.incr("incr thing", redis.print);
multi.incr("incr other thing", redis.print);

// runs immediately
client.mset("incr thing", 100, "incr other thing", 1, redis.print);

// drains multi queue and runs atomically
multi.exec(function (err, replies) {
    console.log(replies); // 101, 2
});

// you can re-run the same transaction if you like
multi.exec(function (err, replies) {
    console.log(replies); // 102, 3
    client.quit();
});

在 Redis 中,EXEC 标记由 MULTI 启动的原子操作的结束。

关于node.js - Redis-node库丢弃事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482537/

相关文章:

node.js - 如何在 Sequelize Postgresql 中执行多个内部连接

php - 使用 mysqli_multi_query 和事务运行多个查询

java - 使用 Redis Sentinel 的 Spring Boot 缓存始终连接到主节点

sorting - Redis 基于分数和日期时间排序的集合作为决胜局?

在 Linux 上使用 Redis 编译 C 代码

javascript - 我如何使用 broccoli.js 获得一个简单的文件树来连接

javascript - 如何扩展 Sequelize 模型

node.js - 无法在 ubuntu 上使用 Node 8 构建 contextify

java - EJB 中的事务管理

php - 交易错误