Найти в Дзене
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;
Около минуты