diff --git a/db/sql/postgres/feature/internals/statistics/locks.txt b/db/sql/postgres/feature/internals/statistics/locks.txt deleted file mode 100644 index cc65281b6..000000000 --- a/db/sql/postgres/feature/internals/statistics/locks.txt +++ /dev/null @@ -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 diff --git a/db/sql/postgres/feature/transaction/locks/docs/articles.txt b/db/sql/postgres/feature/transaction/locks/docs/articles.txt new file mode 100644 index 000000000..df5047150 --- /dev/null +++ b/db/sql/postgres/feature/transaction/locks/docs/articles.txt @@ -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/ diff --git a/db/sql/postgres/feature/transaction/locks/docs/presentations.txt b/db/sql/postgres/feature/transaction/locks/docs/presentations.txt new file mode 100644 index 000000000..793d8cb0a --- /dev/null +++ b/db/sql/postgres/feature/transaction/locks/docs/presentations.txt @@ -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 diff --git a/db/sql/postgres/feature/transaction/locks/docs/tips.txt b/db/sql/postgres/feature/transaction/locks/docs/tips.txt new file mode 100644 index 000000000..7970fa3f7 --- /dev/null +++ b/db/sql/postgres/feature/transaction/locks/docs/tips.txt @@ -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. +Опять же, эта опция позволяет повысить конкурентность выполнения транзакций и избежать ненужных ожиданий на блокировках. +***************************************************************************************************** diff --git a/db/sql/postgres/feature/transaction/locks/locks.txt b/db/sql/postgres/feature/transaction/locks/locks.txt index 39df016ee..fad095c2f 100644 --- a/db/sql/postgres/feature/transaction/locks/locks.txt +++ b/db/sql/postgres/feature/transaction/locks/locks.txt @@ -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. -Опять же, эта опция позволяет повысить конкурентность выполнения транзакций и избежать ненужных ожиданий на блокировках. -***************************************************************************************************** diff --git a/social/stirka.txt b/social/stirka.txt new file mode 100644 index 000000000..05de67bff --- /dev/null +++ b/social/stirka.txt @@ -0,0 +1,6 @@ +LG +Quick Hlopok +800 +40 +without scladoc +superpoloskanie