Исходный код вики Сценарии

Редактировал(а) Alexandr Fokin 2026/07/27 16:56

Последние авторы
1 |(% style="width:146px" %) |(% style="width:1335px" %)(((
2 [[Механизмы>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.Механизмы.WebHome]]
3 )))
4 |(% style="width:146px" %)Шаблон транзакции redis|(% style="width:1335px" %)(((
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>(
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}}
25 |Пример вызова.
26 \\Замечание, если хотя бы одно условие не выполнена, то действие не выполняется ({{code language="c#"}}isExecuted == false{{/code}})|{{code language="c#"}}var counterValue = await ExecuteTransactionAsync(
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
45 return c.incrementResult.Result;
46 }
47 );{{/code}}
48 | |
49 )))
50 |(% style="width:146px" %)Pipelining|(% style="width:1335px" %)
51 |(% style="width:146px" %) |(% style="width:1335px" %)
52
53