StackExchange.Redis v2.2.4版本事务始终无法执行是什么原因?
StackExchange.Redis 事务无法执行问题排查
核心原因
你代码中存在的最直接问题是提前await了事务内的操作方法:
StackExchange.Redis的事务执行逻辑是先将所有事务命令加入本地队列,直到调用ExecuteAsync/Execute时才会批量发送到Redis服务端执行,事务内调用的StringSetAsync等方法返回的Task,在事务提交前永远不会进入完成状态,你提前await这个Task会导致线程无限等待,自然无法命中后续的ExecuteAsync语句。
其他可能原因
- 事务前置条件不满足:你添加了
Condition.KeyExists(key)的检查条件,若调用ExecuteAsync时Redis中不存在对应key,事务会直接在本地终止,不会执行后续逻辑。 - 异步上下文死锁:若上层调用代码用
.Result/.Wait()同步阻塞等待异步事务方法返回,且没有配置.ConfigureAwait(false),会引发异步上下文死锁,线程被卡住无法继续执行。
修复后的代码示例
... var transaction = Database0.CreateTransaction(); transaction.AddCondition(Condition.KeyExists(key)); // 事务内的操作不需要await,不需要读取返回值可直接忽略返回的Task _ = transaction.StringSetAsync(key, value); bool isCommited = await transaction.ExecuteAsync(); if (isCommited) { Logger.Info($"{GUID} Transaction Key {key} SET in Redis"); } else { Logger.Warn($"{GUID} Transaction Key: {key} was NOT SET in Redis."); } ...
内容的提问来源于stack exchange,提问作者Flamur Dervishi
相关产品推荐
相关产品推荐

