我正在使用 servicestack.redis
客户端进行连接。 Redis 基本上被用作 SignalR 背板(它使用 booksleeve 客户端)。我还使用 ServiceStack.Redis 客户端来维护连接列表
我在 RedisConnectionManager.cs
中有这样的代码(以及 AddConnection
和 GetConnections
的类似方法。AddConnection
和 RemoveConnection
由 SignalR 集线器上的方法调用。
现在让我们进入这个问题...偶尔,我在 CreateTransaction 中收到一个
调用。这一般是Redis在if语句InvalidOperationException
消息 A transaction is already in progress
if (connections == null || connections.Count == 0)
中抛出异常后。
无论如何,之后发生的事情是,在我重新启动进程之前一切都不再有效 - 因为每次我都会收到 InvalidOperationException
。我查看了 ServiceStack.Redis 客户端代码,根据文档,它应该提交或丢弃事务。似乎这并没有发生,然后客户端处于不确定状态,因为 RedisClient.Transaction
对象永远不会被 null
ed。
我找不到 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/