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

Редактировал(а) Alexandr Fokin 2024/01/09 16:13

Скрыть последних авторов
Alexandr Fokin 1.11 1 | |(((
Alexandr Fokin 1.2 2 Transactions
3 [[https:~~/~~/redis.io/docs/manual/transactions/>>url:https://redis.io/docs/manual/transactions/]]
4
5 Как же работают транзакции в Redis
6 [[https:~~/~~/habr.com/ru/post/165223/>>url:https://habr.com/ru/post/165223/]]
Alexandr Fokin 1.11 7 )))
8 | |(((
9 | |[[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]]
Alexandr Fokin 1.4 10 |(% style="width:209px" %)[[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]]|(% style="width:1273px" %)(((
Alexandr Fokin 1.3 11 В рамках сессии позволяет установить наблюдение за значением по ключу. Если значение будет изменено, то redis оповестит об этом и позволит откатить операцию, либо выполнить заново.
12
Alexandr Fokin 1.2 13 Как работает Redis при одновременном доступе нескольких клиентов?
14 [[https:~~/~~/ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов>>url:https://ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов]]
15 )))
Alexandr Fokin 1.4 16 |(% style="width:209px" %)[[Пессимистичная блокировка>>doc:Архитектура и модели.Блокировки.Пессимистичная блокировка.WebHome]]|(% style="width:1273px" %)(((
Alexandr Fokin 1.3 17 Не содержит из коробки, но позволяет сконструировать логику блокировки или семафора (ограничение степени параллелизма при выполнении секции) через ручную реализацию.
18 (При такой реализации все клиенты должны исполнять логику по взятию блокировки, а также ее сброса в случае разрыва соединения)
Alexandr Fokin 1.2 19
Alexandr Fokin 1.3 20 Distributed Locks with Redis
21 [[https:~~/~~/redis.io/docs/reference/patterns/distributed-locks/>>https://redis.io/docs/reference/patterns/distributed-locks/]]
22
23 Распределенные блокировки с применением Redis
24 [[https:~~/~~/habr.com/ru/company/piter/blog/518218/>>https://habr.com/ru/company/piter/blog/518218/]]
25 )))
Alexandr Fokin 1.11 26 )))
Alexandr Fokin 1.12 27 |Шаблон транзакции -  оптимистичной блокировки.|(((
28 Команда {{code language="none"}}MULTI{{/code}} обозначает, что все команды, идущие после и выполняющие изменение данных, будут накапливаться и будут выполнены при вызове команды {{code language="none"}}EXEC{{/code}}.
29 При этом команды чтения данных не попадают в транзакцию а выполняются сразу же.
Alexandr Fokin 1.3 30
Alexandr Fokin 1.2 31 {{code language="none"}}
32 // Устанавливаем наблюдение за ключом
33 WATCH mykey
34
35 // Считываем значение в переменную и обновляем ее
36 val = GET mykey
37 val = val + 1
38
39 // Запускаем обновляющую транзакцию
Alexandr Fokin 1.3 40 // Транзакция накладывает свои свойства только на команды обновления данных.
Alexandr Fokin 1.6 41 // Поэтому считыванием значений мы выполняем до Multi.
Alexandr Fokin 1.2 42 MULTI
Alexandr Fokin 1.6 43 SET mykey $val
Alexandr Fokin 1.2 44 EXEC
45
46 //В случае, если в процессе выполнения значение по ключу mykey будет изменено операциями других сессий (относительно захваченного в watch значения), то запрос завершится ошибкой.
47 {{/code}}
Alexandr Fokin 1.12 48 )))
Alexandr Fokin 1.2 49
50 ----
Alexandr Fokin 1.5 51
52 ==== Внутренние ссылки: ====
53
54 ====== Дочерние страницы: ======
55
56 {{children/}}
57
58 ====== Обратные ссылки: ======
59
60 {{velocity}}
61 #set ($links = $doc.getBacklinks())
62 #if ($links.size() > 0)
63 #foreach ($docname in $links)
64 #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
65 * [[$escapetool.xml($rdoc.fullName)]]
66 #end
67 #else
68 No back links for this page!
69 #end
70 {{/velocity}}
71
72 ----