Исходный код вики Транзакции
Редактировал(а) Alexandr Fokin 2024/01/09 16:13
Последние авторы
| author | version | line-number | content |
|---|---|---|---|
| 1 | | |((( | ||
| 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/]] | ||
| 7 | ))) | ||
| 8 | | |((( | ||
| 9 | | |[[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]] | ||
| 10 | |(% style="width:209px" %)[[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]]|(% style="width:1273px" %)((( | ||
| 11 | В рамках сессии позволяет установить наблюдение за значением по ключу. Если значение будет изменено, то redis оповестит об этом и позволит откатить операцию, либо выполнить заново. | ||
| 12 | |||
| 13 | Как работает Redis при одновременном доступе нескольких клиентов? | ||
| 14 | [[https:~~/~~/ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов>>url:https://ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов]] | ||
| 15 | ))) | ||
| 16 | |(% style="width:209px" %)[[Пессимистичная блокировка>>doc:Архитектура и модели.Блокировки.Пессимистичная блокировка.WebHome]]|(% style="width:1273px" %)((( | ||
| 17 | Не содержит из коробки, но позволяет сконструировать логику блокировки или семафора (ограничение степени параллелизма при выполнении секции) через ручную реализацию. | ||
| 18 | (При такой реализации все клиенты должны исполнять логику по взятию блокировки, а также ее сброса в случае разрыва соединения) | ||
| 19 | |||
| 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 | ))) | ||
| 26 | ))) | ||
| 27 | |Шаблон транзакции - оптимистичной блокировки.|((( | ||
| 28 | Команда {{code language="none"}}MULTI{{/code}} обозначает, что все команды, идущие после и выполняющие изменение данных, будут накапливаться и будут выполнены при вызове команды {{code language="none"}}EXEC{{/code}}. | ||
| 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 | |||
| 50 | ---- | ||
| 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 | ---- |