首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackExchange.Redis事务

StackExchange.Redis事务
EN

Stack Overflow用户
提问于 2015-10-08 06:54:10
回答 1查看 6.8K关注 0票数 2

如何在一个事务中运行两个异步方法?

例如:

代码语言:javascript
复制
  var batchIds = new ConcurrentBag<int>();
  var trans = redis.CreateTransaction();

  var task = trans.ListRangeAsync(AllItems, 0L, batchSize - 1).ContinueWith(t =>
   {
    t?.Result.ToList().ForEach(x => batchIds.Add(JsonConvert.DeserializeObject<StockItemDto>(x).Id));
     }).ContinueWith(t=>{ trans.ListTrimAsync(AllItems, batchSize, -1); });  // This not work

  // This work but I'm not sure if taskRemove run exaclly after task
  var taskRemove = trans.ListTrimAsync(AllItems, batchSize, -1);                    
  trans.Execute(CommandFlags.FireAndForget);
  Task.WaitAll(task, taskRemove);

也许有人知道如何从列表中获得一个范围,然后在事务处理中删除这个范围?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-08 07:29:52

你不能这么做。

解决方案是为读操作创建一个常规的IDatabase,为写操作创建一个ITransaction

为什么.?因为StackExchange.Redis事务是Redis的MULTI/EXEC命令的抽象。也就是说,事务是批量发送给Redis的命令队列,它们的执行是原子的。一旦调用ITransaction.Execute,整个传入批处理部件就完成了。

这就是不能在Redis事务中执行读取操作的原因。命令是在批处理中排队和执行的,因此,一旦bacthing结束,您就可以继续执行任何命令,并且这不会作为包装事务的一部分.

OP在一些评论中说..。

也许你能给我点建议?因为我需要从列表中获取项目,并在删除这些项目之后。这些操作必须是线程安全的。

线程安全与Redis事务毫无关系。是您负责将某些锁定方法作为应用程序层的一部分来实现。那么,您可能可以使用Redis作为进程间或多线程锁标志存储来实现该锁。从官方的Redis网站上了解到这篇文章。

事实上,查看另一个Q&A:StackExchange.Redis - LockTake / LockRelease用法

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33008639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档