2013-11-26 2 views
1

Я использую клиента servicestack.redis для подключения. Redis в основном используется как объединительная плата SignalR (в которой используется клиент bookleeve). Я дополнительно используя ServiceStack.Redis клиент для поддержания списка соединенийServiceStack.Redis клиент - транзакция уже выполняется

У меня есть код, как это в RedisConnectionManager.cs (наряду с аналогичными методами AddConnection и GetConnections. В AddConnection и RemoveConnection называются методами на SignalR ступице.

Теперь давайте перейдем к вопросу ... после того, как в то время, я получаю InvalidOperationException с сообщением A transaction is already in progress в CreateTransaction вызова. Это, как правило, после того, как исключение выбрасывается Redis в если заявление if (connections == null || connections.Count == 0).

yway, случается, что после этого вещи перестают работать до тех пор, пока я не перезапущу процесс - поскольку каждый раз я получаю 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

Таким образом, проблема в этом случае состояла в том, что я повторно использовал соединение redis, что было не очень хорошо. Как только я перешел к созданию и использованию нового соединения Redis каждый раз, этот вопрос исчез.

Смежные вопросы