зеркало из
https://github.com/iharh/notes.git
synced 2025-10-29 04:44:18 +02:00
m
Этот коммит содержится в:
родитель
d67845b4e0
Коммит
a9b6cb220a
@ -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
|
||||
11
db/sql/postgres/feature/transaction/locks/docs/articles.txt
Обычный файл
11
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/
|
||||
11
db/sql/postgres/feature/transaction/locks/docs/presentations.txt
Обычный файл
11
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
|
||||
25
db/sql/postgres/feature/transaction/locks/docs/tips.txt
Обычный файл
25
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.
|
||||
Опять же, эта опция позволяет повысить конкурентность выполнения транзакций и избежать ненужных ожиданий на блокировках.
|
||||
*****************************************************************************************************
|
||||
@ -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
Обычный файл
6
social/stirka.txt
Обычный файл
@ -0,0 +1,6 @@
|
||||
LG
|
||||
Quick Hlopok
|
||||
800
|
||||
40
|
||||
without scladoc
|
||||
superpoloskanie
|
||||
Загрузка…
x
Ссылка в новой задаче
Block a user