Исходный код вики Транзакции

Версия 1.3 от Alexandr Fokin на 2022/11/01 00:34

Последние авторы
1 Transactions
2 [[https:~~/~~/redis.io/docs/manual/transactions/>>url:https://redis.io/docs/manual/transactions/]]
3
4 Как же работают транзакции в Redis
5 [[https:~~/~~/habr.com/ru/post/165223/>>url:https://habr.com/ru/post/165223/]]
6
7
8 |(% style="width:232px" %)Оптимистичные блокировки|(% style="width:1250px" %)(((
9 В рамках сессии позволяет установить наблюдение за значением по ключу. Если значение будет изменено, то redis оповестит об этом и позволит откатить операцию, либо выполнить заново.
10
11 Как работает Redis при одновременном доступе нескольких клиентов?
12 [[https:~~/~~/ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов>>url:https://ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов]]
13 )))
14 |(% style="width:232px" %)Пессимистичные блокировки|(% style="width:1250px" %)(((
15 Не содержит из коробки, но позволяет сконструировать логику блокировки или семафора (ограничение степени параллелизма при выполнении секции) через ручную реализацию.
16 (При такой реализации все клиенты должны исполнять логику по взятию блокировки, а также ее сброса в случае разрыва соединения)
17
18 Distributed Locks with Redis
19 [[https:~~/~~/redis.io/docs/reference/patterns/distributed-locks/>>https://redis.io/docs/reference/patterns/distributed-locks/]]
20
21 Распределенные блокировки с применением Redis
22 [[https:~~/~~/habr.com/ru/company/piter/blog/518218/>>https://habr.com/ru/company/piter/blog/518218/]]
23 )))
24
25 ----
26
27 Команда {{code language="none"}}MULTI{{/code}} обозначает, что все команды, идущие после и выполняющие изменение данных, будут накапливаться и будут выполнены при вызове команды {{code language="none"}}EXEC{{/code}}. При этом команды чтения данных не попадают в транзакцию а выполняются сразу же.
28
29 Шаблон оптимистичной блокировки.
30
31 {{code language="none"}}
32 // Устанавливаем наблюдение за ключом
33 WATCH mykey
34
35 // Считываем значение в переменную и обновляем ее
36 val = GET mykey
37 val = val + 1
38
39 // Запускаем обновляющую транзакцию
40 // Транзакция накладывает свои свойства только на команды обновления данных.
41 // ПОэтому считыванием значений мы выполняем до Multi.
42 MULTI
43 SET mykey $val
44 EXEC
45
46 //В случае, если в процессе выполнения значение по ключу mykey будет изменено операциями других сессий (относительно захваченного в watch значения), то запрос завершится ошибкой.
47 {{/code}}
48
49 ----