Исходный код вики Сценарии
Редактировал(а) Alexandr Fokin 2026/07/27 16:56
Скрыть последних авторов
| author | version | line-number | content |
|---|---|---|---|
| |
1.6 | 1 | |(% style="width:146px" %) |(% style="width:1335px" %)((( |
| 2 | [[Механизмы>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.Механизмы.WebHome]] | ||
| 3 | ))) | ||
| |
1.2 | 4 | |(% style="width:146px" %)Шаблон транзакции redis|(% style="width:1335px" %)((( |
| |
1.6 | 5 | |((( |
| 6 | [[Транзакции>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.Механизмы.Транзакции.WebHome]] | ||
| 7 | |||
| 8 | 1. Сначала подготавливаем контейнер команд. | ||
| 9 | 1. Выполняем транзакцию. | ||
| 10 | 1. Обрабатываем результаты команд. | ||
| 11 | )))|{{code language="c#"}}private static async ValueTask<TResult> ExecuteTransactionAsync<TParam, TCommands, TResult>( | ||
| |
1.2 | 12 | TParam param, |
| 13 | IDatabase database, | ||
| 14 | Func<TParam, ITransaction, TCommands> prepareHandller, | ||
| 15 | Func<TParam, TCommands, bool, TResult> executedHandler) | ||
| 16 | { | ||
| 17 | var transaction = database.CreateTransaction(); | ||
| 18 | |||
| 19 | var prepareResult = prepareHandller(param, transaction); | ||
| 20 | |||
| 21 | var isExecuted = await transaction.ExecuteAsync(); | ||
| 22 | |||
| 23 | return executedHandler(param, prepareResult, isExecuted); | ||
| 24 | }{{/code}} | ||
| |
1.3 | 25 | |Пример вызова. |
| 26 | \\Замечание, если хотя бы одно условие не выполнена, то действие не выполняется ({{code language="c#"}}isExecuted == false{{/code}})|{{code language="c#"}}var counterValue = await ExecuteTransactionAsync( | ||
| |
1.2 | 27 | (1, key), |
| 28 | db, | ||
| 29 | prepareHandller: static (p, t) => | ||
| 30 | { | ||
| 31 | var keyExists = t.AddCondition(Condition.KeyExists(p.key)); | ||
| 32 | var incrementResult = t.StringIncrementAsync(p.key, 1); | ||
| 33 | |||
| 34 | return ( | ||
| 35 | keyExists, | ||
| 36 | incrementResult); | ||
| 37 | }, | ||
| 38 | executedHandler: static (p, c, r) => | ||
| 39 | { | ||
| 40 | if (!c.keyExists.WasSatisfied) | ||
| 41 | { | ||
| 42 | throw new Exception($"Ожидается, что ключ уже должен существовать. {p.key}"); | ||
| 43 | } | ||
| 44 | |||
| |
1.4 | 45 | return c.incrementResult.Result; |
| |
1.2 | 46 | } |
| 47 | );{{/code}} | ||
| 48 | | | | ||
| 49 | ))) | ||
| |
1.5 | 50 | |(% style="width:146px" %)Pipelining|(% style="width:1335px" %) |
| |
1.2 | 51 | |(% style="width:146px" %) |(% style="width:1335px" %) |
| 52 | |||
| 53 |