| Шаблон транзакции redis | Транзакции - Сначала подготавливаем контейнер команд.
- Выполняем транзакцию.
- Обрабатываем результаты команд.
| private static async ValueTask<TResult> ExecuteTransactionAsync<TParam, TCommands, TResult>( TParam param, IDatabase database, Func<TParam, ITransaction, TCommands> prepareHandller, Func<TParam, TCommands, bool, TResult> executedHandler) { var transaction = database.CreateTransaction();
var prepareResult = prepareHandller(param, transaction);
var isExecuted = await transaction.ExecuteAsync();
return executedHandler(param, prepareResult, isExecuted); } | Пример вызова.
Замечание, если хотя бы одно условие не выполнена, то действие не выполняется (isExecuted == false) | var counterValue = await ExecuteTransactionAsync( (1, key), db, prepareHandller: static (p, t) => { var keyExists = t.AddCondition(Condition.KeyExists(p.key)); var incrementResult = t.StringIncrementAsync(p.key, 1);
return ( keyExists, incrementResult); }, executedHandler: static (p, c, r) => { if (!c.keyExists.WasSatisfied) { throw new Exception($"Ожидается, что ключ уже должен существовать. {p.key}"); }
return c.incrementResult.Result; } ); | | | |
|