2016-11-11 12 views
0

У меня есть многопоточное приложение JEE, которое запускает SELECT FOR UPDATE LIMIT 1; запрос в таблице с предложением WHERE и строку обновления в каждой транзакции, которые создают блокировку записи на уровне строк и не блокируют чтение читателей.Postgres Write/Read Lock

Есть ли способ настроить postgres, чтобы читатели не читали строки с блокировкой записи?

ответ

1

На Postgres 9.5+ есть SKIP LOCKED вариант:

Если вам необходимо выбрать из таблицы и защиты этих строк от обновления до транзакция не будет завершена, вы должны указать FOR UPDATE, но если какой-то строки заблокированы, вы можете указать SKIP LOCKED, чтобы сказать ему просто игнорировать эти строки и просто выполнять операцию в зависимости от того, какие строки она может получить.

https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#SKIP_LOCKED

0

Вот вариант для вас, если вы runnint Postgres < = 9.4, где NOWAIT существует, но SKIP LOCKED. Это демонстрирует использование CONTINUE и EXIT в LOOP, чтобы идентифицировать следующую доступную разблокированную одну строку.

DO $$ 
DECLARE 
    r RECORD; 
    ... -- your variables 
BEGIN 
    FOR r IN 
     SELECT some_id 
      FROM some_table 
     WHERE ... -- your conditions 
     ORDER BY ... -- your ordering 
     LIMIT ... -- your limit 
    LOOP 
     BEGIN 
      SELECT ... -- your needed column(s) 
       INTO ... -- your defined variable(s) 
       FROM some_table -- the same table 
      WHERE some_id = r.some_id -- only check this one record 
       FOR UPDATE NOWAIT; -- don't wait for parallel transactions 
      EXIT; 
     EXCEPTION WHEN lock_not_available THEN 
      CONTINUE; 
     END; 
    END LOOP; 
    ... -- do something based on variables, or move this before the EXIT above 
END; 
$$ LANGUAGE plpgsql; 

 Смежные вопросы

  • Нет связанных вопросов^_^