[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-kakie-vidy-blokirovok-sushchestvuyut-v-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},947,"kakie-vidy-blokirovok-sushchestvuyut-v-postgresql",28,"postgresql","PostgreSQL","🐘","Какие виды блокировок существуют в PostgreSQL?","PostgreSQL использует многоуровневую систему блокировок: строковые (row-level) и табличные (table-level). Строковые блокировки не используют память менеджера блокировок — информация хранится в самих строках через `xmax`.\n\n### Строковые блокировки (row-level locks)\n\n```sql\n-- Явная блокировка строк\nSELECT * FROM accounts WHERE id = 1 FOR UPDATE;          -- эксклюзивная блокировка\nSELECT * FROM accounts WHERE id = 1 FOR NO KEY UPDATE;   -- без блокировки FK\nSELECT * FROM accounts WHERE id = 1 FOR SHARE;           -- разделяемая (для чтения)\nSELECT * FROM accounts WHERE id = 1 FOR KEY SHARE;       -- мягкая разделяемая\n```\n\nПолезные модификаторы:\n\n```sql\n-- SKIP LOCKED — пропустить заблокированные строки (очередь задач)\nSELECT * FROM task_queue\nWHERE status = 'new'\nORDER BY created_at\nLIMIT 1\nFOR UPDATE SKIP LOCKED;\n\n-- NOWAIT — не ждать, сразу ошибка\nSELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;\n```\n\n### Табличные блокировки (table-level locks)\n\n| Режим | Конфликтует с |\n|---|---|\n| `ACCESS SHARE` | `ACCESS EXCLUSIVE` |\n| `ROW SHARE` | `EXCLUSIVE`, `ACCESS EXCLUSIVE` |\n| `ROW EXCLUSIVE` | `SHARE`, `SHARE ROW EXCLUSIVE`, `EXCLUSIVE`, `ACCESS EXCLUSIVE` |\n| `SHARE` | `ROW EXCLUSIVE`, `SHARE ROW EXCLUSIVE`, `EXCLUSIVE`, `ACCESS EXCLUSIVE` |\n| `ACCESS EXCLUSIVE` | Все режимы |\n\nОбычные операции автоматически берут блокировки: SELECT -> `ACCESS SHARE`, INSERT\u002FUPDATE\u002FDELETE -> `ROW EXCLUSIVE`, CREATE INDEX -> `SHARE`, ALTER TABLE \u002F DROP TABLE -> `ACCESS EXCLUSIVE`.\n\n```sql\n-- CREATE INDEX CONCURRENTLY не блокирует запись\nCREATE INDEX CONCURRENTLY idx_tx_amount ON transactions (amount);\n```\n\n\u003Cdetails>\u003Csummary>Мониторинг блокировок\u003C\u002Fsummary>\n\n```sql\n-- Посмотреть текущие блокировки\nSELECT pid, relation::regclass, mode, granted\nFROM pg_locks\nWHERE NOT granted;\n\n-- Найти блокирующие и ожидающие запросы\nSELECT blocked.pid AS blocked_pid,\n       blocked.query AS blocked_query,\n       blocking.pid AS blocking_pid,\n       blocking.query AS blocking_query\nFROM pg_stat_activity blocked\nJOIN pg_locks bl ON bl.pid = blocked.pid AND NOT bl.granted\nJOIN pg_locks bk ON bk.relation = bl.relation AND bk.granted\nJOIN pg_stat_activity blocking ON blocking.pid = bk.pid\nWHERE blocked.pid != blocking.pid;\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** ключевые практические знания — `FOR UPDATE SKIP LOCKED` для реализации очереди задач и `CREATE INDEX CONCURRENTLY` для создания индексов без блокировки записи на production. Это показывает опыт работы с реальными системами.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие виды блокировок существуют в PostgreSQL? — Gymterview","PostgreSQL использует многоуровневую систему блокировок: строковые (row-level) и табличные (table-level). Строковые блокировки не используют память менеджера бл","PostgreSQL использует многоуровневую систему блокировок: строковые (row-level) и табличные (table-level). Строковые блок",[7,13],"PostgreSQL использует многоуровневую систему блокировок: строковые (row-level) и табличные (table-level). Строковые блокировки не используют память менеджера блокировок — информация хранится в самих строках через `xmax`.",true]