Этот коммит содержится в:
Ihar Hancharenka 2025-01-11 08:34:22 +03:00
родитель d67845b4e0
Коммит a9b6cb220a
6 изменённых файлов: 55 добавлений и 57 удалений

Просмотреть файл

@ -1,10 +0,0 @@
select ..., pg_blocking_pids(pid), ...
from pg_stat_activity
where
backend_type = 'client backend';
pg_locks
transactionid, granted
pg_terminate_backend(pid)
function

Просмотреть файл

@ -0,0 +1,11 @@
2019
Rogov - about locks
https://habr.com/ru/companies/postgrespro/articles/466199/
https://habr.com/ru/companies/postgrespro/articles/465263/
https://habr.com/ru/companies/postgrespro/articles/463819/
https://habr.com/ru/companies/postgrespro/articles/462877/
2018
https://www.citusdata.com/blog/2018/02/22/seven-tips-for-dealing-with-postgres-locks/
https://habr.com/ru/company/otus/blog/452986/
2015
https://habrahabr.ru/company/postgrespro/blog/270827/

Просмотреть файл

@ -0,0 +1,11 @@
2023
Tenzor - Borovikov - Backend School - 7 Locks 3:00 of 1:04:52
https://www.youtube.com/watch?v=RjLlixMdnSQ
https://www.postgresql.org/docs/current/explicit-locking.html
2019
HighLoad - Rogov - PG Locks of 48:42
https://www.youtube.com/watch?v=_R2-IsKfsUU
https://highload.ru/moscow/2019/abstracts/6067
2012
https://www.youtube.com/watch?v=s3ee0nuDDqs
https://momjian.us/main/writings/pgsql/locking.pdf

Просмотреть файл

@ -0,0 +1,25 @@
*****************************************************************************************************
В PostgreSQL есть мощный механизм блокировок, который как раз может помочь избежать таких ситуаций на уровне базы данных, упростив разработку приложения.
Выражение SELECT FOR UPDATE, в отличии от обычного SELECT устанавливает блокировку на уровне строк (row-level lock), что и позволяет безопасно поменять данные,
избежав конфликтных ситуаций. Когда мы используем SELECT FOR UPDATE, блокировка не дает изменить или удалить выбранные строки другим транзакциям, до завершения текущей транзакции.
Если продолжать аналогию с системой бронирования номеров в отеле, то можно привести вот такой пример запроса:
BEGIN ;
SELECT * FROM rooms WHERE room._number = '10' and status = 'available' FOR UPDATE;
Здесь мы явно открываем транзакцию (BEGIN) и из таблицы с номерами отеля (rooms) , выбираем комнату с номером 10 и статусом свободна (available).
Таким образом мы можем быть уверены, что пока пользователь выбирает и оплачивает номер, другой не успеет его забронировать, так как запись будет заблокирована до конца транзакции.
Чтобы избежать ситуаций когда SELECT FOR UPDATE не может получить блокировку, так как строка заблокирована другой транзакцией,
в результате чего происходят сильные задержки в транзакции или взаимоблокировки, существует опция NOWAIT.
Эта опция позволяет приложению избежать конфликтов блокировок в реальном времени, вместо того чтобы ждать когда освободиться необходимая строка.
Существует еще одна полезная опция в контексте выражения SELECT FOR UPDATE, называется она SKIP LOCKED.
Суть ее состоит в том, что она позволяет избежать строк, которые уже заблокированы другой транзакцией.
Т.е. в примере, приведенном выше, если бы вторая транзакция искала свободные номера, то она бы не увидела в своем результате комнату с номером 10.
Опять же, эта опция позволяет повысить конкурентность выполнения транзакций и избежать ненужных ожиданий на блокировках.
*****************************************************************************************************

Просмотреть файл

@ -1,25 +1,7 @@
https://postgrespro.ru/docs/postgresql/16/explicit-locking
https://www.postgresql.org/docs/current/explicit-locking.html
https://postgrespro.ru/docs/postgresql/current/explicit-locking
https://pglocks.org/?pgcommand=VACUUM
2019
HighLoad - Rogov - PG Locks of 48:42
https://www.youtube.com/watch?v=_R2-IsKfsUU
https://highload.ru/moscow/2019/abstracts/6067
Rogov - about locks
https://habr.com/ru/companies/postgrespro/articles/466199/
https://habr.com/ru/companies/postgrespro/articles/465263/
https://habr.com/ru/companies/postgrespro/articles/463819/
https://habr.com/ru/companies/postgrespro/articles/462877/
2018
https://www.citusdata.com/blog/2018/02/22/seven-tips-for-dealing-with-postgres-locks/
https://habr.com/ru/company/otus/blog/452986/
2015
https://habrahabr.ru/company/postgrespro/blog/270827/
2012
https://www.youtube.com/watch?v=s3ee0nuDDqs
https://momjian.us/main/writings/pgsql/locking.pdf
samples
select ... for update;
@ -33,30 +15,3 @@ pg_locks
pg_terminate_backend(pid)
function
*****************************************************************************************************
В PostgreSQL есть мощный механизм блокировок, который как раз может помочь избежать таких ситуаций на уровне базы данных, упростив разработку приложения.
Выражение SELECT FOR UPDATE, в отличии от обычного SELECT устанавливает блокировку на уровне строк (row-level lock), что и позволяет безопасно поменять данные,
избежав конфликтных ситуаций. Когда мы используем SELECT FOR UPDATE, блокировка не дает изменить или удалить выбранные строки другим транзакциям, до завершения текущей транзакции.
Если продолжать аналогию с системой бронирования номеров в отеле, то можно привести вот такой пример запроса:
BEGIN ;
SELECT * FROM rooms WHERE room._number = '10' and status = 'available' FOR UPDATE;
Здесь мы явно открываем транзакцию (BEGIN) и из таблицы с номерами отеля (rooms) , выбираем комнату с номером 10 и статусом свободна (available).
Таким образом мы можем быть уверены, что пока пользователь выбирает и оплачивает номер, другой не успеет его забронировать, так как запись будет заблокирована до конца транзакции.
Чтобы избежать ситуаций когда SELECT FOR UPDATE не может получить блокировку, так как строка заблокирована другой транзакцией,
в результате чего происходят сильные задержки в транзакции или взаимоблокировки, существует опция NOWAIT.
Эта опция позволяет приложению избежать конфликтов блокировок в реальном времени, вместо того чтобы ждать когда освободиться необходимая строка.
Существует еще одна полезная опция в контексте выражения SELECT FOR UPDATE, называется она SKIP LOCKED.
Суть ее состоит в том, что она позволяет избежать строк, которые уже заблокированы другой транзакцией.
Т.е. в примере, приведенном выше, если бы вторая транзакция искала свободные номера, то она бы не увидела в своем результате комнату с номером 10.
Опять же, эта опция позволяет повысить конкурентность выполнения транзакций и избежать ненужных ожиданий на блокировках.
*****************************************************************************************************

6
social/stirka.txt Обычный файл
Просмотреть файл

@ -0,0 +1,6 @@
LG
Quick Hlopok
800
40
without scladoc
superpoloskanie