我正在使用servicestack.redis
客户端进行连接。 Redis基本上被用作SignalR背板(使用书架式客户端)。我还在使用ServiceStack.Redis客户端来维护连接列表
我在RedisConnectionManager.cs
中有这样的代码(以及AddConnection
和GetConnections
的类似方法。AddConnection
和RemoveConnection
由方法调用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();
}
}
答案 0 :(得分:1)
所以在这种情况下的问题是我重新使用redis连接并不是一个好主意。每当我开始创建和使用新的Redis连接时,这个问题就消失了。