2016-07-26 5 views
0

Представьте себе следующую ситуацию: у нас есть таблица, в которой строки вставляются с некоторыми ограничениями. Например,совокупная проверка перед изменением данных и блокировкой

  1. SELECT COUNT (*) FROM таблицы WHERE ....
  2. Проверить, если рассчитывать меньше некоторого значения
  3. Если условие истинно - INSERT ..., в противном случае - ROLLBACK

Он работает, если у нас не так много одновременных запросов. Для одновременных запросов на рукоятку существует несколько способов:

  1. Сохраните счетчик в другой таблице, или в Redis. И управляйте этим счетчиком при каждом обновлении.
  2. Заблокируйте всю таблицу перед каждой вставкой.

Я использую PostgreSQL. Каков наилучший способ решить эту ситуацию?

ответ

0

Попробуйте сыграть с statement_timeout и lock_timeout явно set вместо каждой пользовательской сессии. Посмотрите here для деталей.

+0

Как это связано с вопросом? –

0

Блокировка стола довольно экстремальная и плохо повреждает параллелизм.

Поддержание счетчика в отдельной таблице было бы лучше; он по существу сериализует INSERT s (следующая транзакция может обновлять счетчик только после того, как предыдущая транзакция освободила блокировку с помощью COMMIT).

Третий способ заключается в использовании SERIALIZABLE сделок. Если все транзакции связаны с SERIALIZABLE, ваше условие будет автоматически гарантировано, если вы выполните SELECT count(*) ... и INSERT за одну транзакцию. Недостатком является то, что транзакции могут быть прерваны с ошибками сериализации, и вы должны быть готовы повторить их.

+0

Спасибо, за ваш ответ. – user3928409