В чём основная проблема данной реализации

Основная проблема данной реализации — отсутствие явного коммита транзакции.

Короткий ответ

Что ответить на собеседовании

Основная проблема данной реализации — отсутствие явного коммита транзакции. В коде начинается транзакция с BEGIN;, создаются таблица и функция, затем вставляется запись и вызывается функция обновления, но строка с COMMIT; закомментирована. Это значит, что изменения не будут зафиксированы в базе, и все операции откатятся при завершении сессии.

Подробный разбор

Ответ с пояснениями

Условие

В чём основная проблема данной реализации

BEGIN;

CREATE TABLE sneakers ( id SERIAL PRIMARY KEY, design JSON NOT NULL );

CREATE OR REPLACE FUNCTION process_sneaker_order(sneaker_id INTEGER) RETURNS VOID AS $$ BEGIN UPDATE sneakers SET design = jsonb_set(design, '{status}', '"Processed"') WHERE id = sneaker_id; END; $$ LANGUAGE plpgsql;

INSERT INTO sneakers (design) VALUES ('{"colors":"red,blue", "status":"Pending"}');

PERFORM process_sneaker_order(1);

-- COMMIT;

Ответ

Основная проблема данной реализации — отсутствие явного коммита транзакции. В коде начинается транзакция с BEGIN;, создаются таблица и функция, затем вставляется запись и вызывается функция обновления, но строка с COMMIT; закомментирована. Это значит, что изменения не будут зафиксированы в базе, и все операции откатятся при завершении сессии.

Кроме того, использование jsonb_set с типом json может привести к ошибкам, так как функция работает с jsonb. Лучше сразу объявить столбец design как jsonb.

Пример исправления:

BEGIN;

CREATE TABLE sneakers (
  id SERIAL PRIMARY KEY,
  design JSONB NOT NULL
);

CREATE OR REPLACE FUNCTION process_sneaker_order(sneaker_id INTEGER) RETURNS VOID AS $$
BEGIN
  UPDATE sneakers SET design = jsonb_set(design, '{status}', '"Processed"') WHERE id = sneaker_id;
END;
$$ LANGUAGE plpgsql;

INSERT INTO sneakers (design) VALUES ('{"colors":"red,blue", "status":"Pending"}');

PERFORM process_sneaker_order(1);

COMMIT;

Также стоит учитывать, что создание таблиц и функций обычно делают вне транзакций, которые обрабатывают данные, чтобы избежать блокировок и ошибок в продакшене.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее