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

时间:2013-11-26 15:36:47

标签: c# transactions redis servicestack

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

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

现在让我们讨论这个问题......偶尔,我会在InvalidOperationException来电中收到A transaction is already in progress消息CreateTransaction。这通常是在Redis在if语句if (connections == null || connections.Count == 0)中抛出异常之后。

无论如何,接下来会发生的事情是,在我重新启动流程之前,事情不再有效 - 因为每次我得到一个InvalidOperationException。我搜索了ServiceStack.Redis客户端代码,根据文档,它应该提交或放弃事务。似乎没有发生这种情况,然后客户端处于不稳定状态,因为RedisClient.Transaction对象永远不会null

我找不到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();
        }
    }

1 个答案:

答案 0 :(得分:1)

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