gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:21:03 28 4
gpt4 key购买 nike

实际上,我正在使用优秀的库 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com