c# - ServiceStack.Redis 客户端 - 事务已在进行中

标签 c# transactions redis servicestack

我正在使用 servicestack.redis 客户端进行连接。 Redis 基本上被用作 SignalR 背板(它使用 booksleeve 客户端)。我还使用 ServiceStack.Redis 客户端来维护连接列表

我在 RedisConnectionManager.cs 中有这样的代码(以及 AddConnectionGetConnections 的类似方法。AddConnectionRemoveConnection 由 SignalR 集线器上的方法调用。

现在让我们进入这个问题...偶尔,我在 CreateTransaction 中收到一个 InvalidOperationException 消息 A transaction is already in progress 调用。这一般是Redis在if语句if (connections == null || connections.Count == 0)中抛出异常后。

无论如何,之后发生的事情是,在我重新启动进程之前一切都不再有效 - 因为每次我都会收到 InvalidOperationException。我查看了 ServiceStack.Redis 客户端代码,根据文档,它应该提交或丢弃事务。似乎这并没有发生,然后客户端处于不确定状态,因为 RedisClient.Transaction 对象永远不会被 nulled。

我找不到 ServiceStack.Redis 的错误跟踪器,所以希望 SO 上的人会知道得更多。

    public void RemoveConnection(string clientId, string connectionId)
    {

        try
        {
            var key = "CONNECTION_" + clientId;
            redis.Watch(key);

            var connections = redisTypedClient.Lists[key];


            if (connections == null || connections.Count == 0)
            {
                return;
            }


            using (var t = redisTypedClient.CreateTransaction())
            {
                t.QueueCommand(c => c.RemoveItemFromList(connections, connectionId));
                t.Commit();
            }

        }
        finally
        {
            redis.UnWatch();
        }
    }

最佳答案

所以在这种情况下的问题是我重用了 redis 连接,这不是一个好主意。一旦我开始每次都创建和使用新的 Redis 连接,这个问题就消失了。

关于c# - ServiceStack.Redis 客户端 - 事务已在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20221429/

相关文章:

redis - Redis中的过滤元素

c# - 将 "\"替换为 ""

c# - ASP.NET C# 必须声明标量变量

c# - 使用 .NET WebClient 模拟 XmlHttpRequest

JBoss 事务超时设置?

asp.net-core - 在 asp .NET 核心中连接到特定的 Azure Redis 数据库

c# - 获取运行Sap logon vb6的GuiApplication to c#

postgresql - 读取由 postgresql 函数创建的未提交行?

java - 事务是否收集对数据库的查询或锁定数据库直到提交?

node.js - nodejs延迟执行redis命令