Sobes.tech
Назад к вопросам
Senior
3

Что такое SELECT FOR UPDATE и SELECT FOR SHARE? В чём разница?

Компании, где спрашивали
EXPERA

Ответ от нейросети

sobes.tech AI

SELECT FOR UPDATE и SELECT FOR SHARE — это конструкции SQL, используемые для блокировки строк при выборке данных в транзакциях, чтобы обеспечить согласованность и избежать конфликтов при параллельном доступе.

  • SELECT FOR UPDATE блокирует выбранные строки для последующего обновления. Другие транзакции не смогут изменить или заблокировать эти строки, пока текущая транзакция не завершится. Это эксклюзивная блокировка.

  • SELECT FOR SHARE (иногда FOR SHARE MODE) устанавливает разделяемую блокировку на выбранные строки. Другие транзакции могут читать и устанавливать свои разделяемые блокировки, но не могут обновлять или удалять эти строки, пока блокировка действует.

Разница:

  • FOR UPDATE — блокировка для изменения (эксклюзивная), предотвращает любые изменения другими транзакциями.
  • FOR SHARE — блокировка для чтения, разрешает совместное чтение, но запрещает изменения.

Пример:

BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- здесь можно безопасно обновить запись
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;