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