Вопрос

Для моей реализации конкретная запись должна быть сделана оптом и без вероятности другого вмешательства.

Я был сказал что две конкурирующие транзакции таким образом приведут к первой блокировке второго, а второй май или не может завершить после первого имени.

Пожалуйста, опубликуйте документацию, которая подтверждает это. Кроме того, что именно происходит со второй транзакцией, если первая блокировка? Будет очередным, потерпеть неудачу или некоторую комбинацию?

Если это не может быть подтверждено, следует ли установить уровень изоляции транзакций для этой транзакции для SERIALIZABLE? Если это так, как это можно сделать с подготовленными утверждениями libpqxx?

Если транзакции сериализуются, будет ли вторые транзакции или в очереди до того, как первый не будет завершен?

Если либо выключен, как это может быть обнаружено с libpqxx?

Это было полезно?

Решение

Единственный способ к выводу предотвращение эффектов параллелизма состоит в том, чтобы генеракодичевать каждую таблицу, которую вы хотите изменить.

Это означает, что вы действительно делаете только одну вещь за раз. Он также приводит к забавные проблемы с тупиками, если вы не всегда приобретете свои замки в том же порядке.

Так что обычно, что вам нужно сделать, это выяснить, какие именно операции, которые вы хотите сделать, и как они взаимодействуют. Определите, какие эффекты параллелизма вы можете терпеть, и как предотвратить их, чтобы они не могли.

Этот вопрос, как он стоит слишком широко, чтобы словенно ответить.

Варианты

включают в себя:

    .
  • Исключительно блокирующие таблицы. (Это единственный путь , чтобы сделать многорядное увеличение без проблем параллелизма в PostgreSQL прямо сейчас). Остерегайтесь блокировки обновления и заблокировки, связанные с загрузкой.

  • Соответствующее использование изоляции LOCK TABLE ... IN ACCESS EXCLUSIVE MODE - но помните, что вы должны иметь возможность сохранить запись о том, что вы делали во время транзакции и повторите его, если TX прерывает.

  • Тщательная блокировка уровня строки - SERIALIZABLE, SELECT ... FOR UPDATE.

  • "Оптимистическая блокировка" / оптимистичный контроль параллелизма, где это уместно

  • Написание ваших запросов способами, которые делают их более дружелюбными к параллельной работе. Например, замена циклов чтения-модификации-записи с обновлениями на месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top