64 подписчика
-- scenario3.sql
-- UPDATE
-- 5.2
CREATE OR REPLACE FUNCTION scenario3() RETURNS integer AS $$
DECLARE
current_aid bigint ;
current_delta bigint ;
BEGIN
-- Генерация случайного сдвига
current_delta := (ROUND(RANDOM())::BIGINT) * 10 + 1;
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- ТОЛЬКО ДЛЯ scale = 685
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- Атомарный выбор и блокировка одной строки с пропуском заблокированных
-- FOR UPDATE SKIP LOCKED для выбора одной доступной строки
current_aid = floor(random() * (68500000 - 1 + 1)) + 1 ;
SELECT aid INTO current_aid
FROM pgbench_accounts
WHERE aid = current_aid
FOR UPDATE SKIP LOCKED;
-- Если строка найдена — обновляем её
IF current_aid IS NOT NULL THEN
UPDATE pgbench_accounts
SET abalance = abalance + current_delta
WHERE aid = current_aid;
END IF;
return 0 ;
END
$$ LANGUAGE plpgsql;
Около минуты
Вчера