Я использую Stackexchange.Redis на кластерных серверах ASP.Net Core, и у меня возникают проблемы с транзакциями.
Следующий код должен удалить поле с ключом "hashItemID" из двух хешей, "HashA" и "HashB", но только если оно существует в обоих:
var hashAKey = "HashA";
var hashBKey = "HashB";
var id = "hashItemID";
var tran = redis.Database.CreateTransaction();
// Only delete the item if it exists in both hashes
var hashBCondition = tran.AddCondition(Condition.HashExists(hashBKey, id));
var hashACondition = tran.AddCondition(Condition.HashExists(hashAKey, id));
tran.HashDeleteAsync(hashBKey, id);
tran.HashDeleteAsync(hashAKey, id);
var deleted = await tran.ExecuteAsync();
if (!deleted)
{
logger.LogWarning("Failed to delete '{ID}'. HashAResult: {A}, HashBResult: {B}", id, hashACondition.WasSatisfied, hashBCondition.WasSatisfied);
}
Иногда этот код завершается ошибкой с журналом:
Failed to delete 'hashItemID'. HashAResult: True, HashBResult: True
У меня сложилось впечатление, что транзакции терпят неудачу, только если их условия не выполняются, это правда?
Если посмотреть на показатели сети и производительности, то здесь нет ни таймаутов, ни большого использования памяти.