2012-06-06 2 views
1

ActionSuccess обратного вызова с IncrementKey не работает в транзакции:Autoincrement Id с транзакцией в Redis (ServiceStack RedisClient)

public class Article 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

[Test] 
public void Can_create_article_with_autoincremental-id() 
{ 
    Article a = new Article() { Name = "I Love Writing Test" }; 
    using (var trans = Redis.CreateTransaction()) 
    { 
     trans.QueueCommand(r => r.IncrementValue("id:article"), id => a.Id = id); 
     trans.QueueCommand(r => r.Store<Article>(a)); 

     trans.Commit(); 
    } 

    Assert.That(Redis.Get<Article>("1").Id,Is.Equal("1")); 
} 
+0

Задайте только один вопрос на вопрос. Если у клиента возникла проблема с отправкой теста с ошибкой. – mythz

+0

Когда выполняется обратный вызов actionuccess? Если после совершения транзакции нет решения для этого. – ozz

+0

Отправьте неудачный тест на https://github.com/ServiceStack/ServiceStack.Redis - если вы хотите, чтобы кто-то просмотрел ваши проблемы. – mythz

ответ

0

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

Если вы просто хотите хранить статью с автоинкрементом Id счетчик, вы можете просто сделать:

var a = new Article { 
    Id = Redis.As<Article>().GetNextSequence(), 
    Name = "I Love Writing Test" 
}; 
Redis.Store(a); 

Там нет необходимости в операции для этого. Использовать значения из Redis внутри транзакции, которая будет выполняться только в том случае, если ни одно из значений не изменилось, используйте команду WATCH. См. Мой более ранний ответ for an example.

+0

Я стараюсь избегать ненужных приращений и пустых идентификаторов. Потому что если будет отмена (я также использую WATCH). Идентификатор статьи будет бесполезен. – ozz

+0

Так что, может быть, реальный вопрос: как я могу гарантировать последовательный идентификатор в Redis? – ozz

+0

Идентификаторы всегда последовательны. Они используют команду INCR Redis. – mythz

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