64 подписчика
-- scenario3.sql
-- 6.0
-- OLAP
-- UPDATE
CREATE OR REPLACE FUNCTION scenario3() RETURNS integer AS $$
DECLARE
min_i bigint ;
max_i bigint ;
current_aid bigint ;
current_delta bigint ;
BEGIN
-- Генерация случайного сдвига
current_delta := (ROUND(RANDOM())::BIGINT) * 10 + 1;
-- Атомарный выбор и блокировка одной строки с пропуском заблокированных
-- Используем LIMIT 1 и FOR UPDATE SKIP LOCKED для выбора одной доступной строки
min_i = 1 ;
SELECT MAX(aid) INTO max_i FROM pgbench_accounts ;
current_aid = floor(random() * (max_i - min_i + 1)) + min_i ;
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;
Около минуты
2 дня назад