Возможно ли откат обеих транзакций во время тупика или ошибки сериализации?

В PostgreSQL (и других базах данных MVCC) транзакции могут откатываться из-за тупиковой ситуации или ошибки сериализации. Предположим, что в настоящее время выполняются две транзакции. Возможно ли когда-нибудь, что вместо одной транзакции произойдет сбой из-за ошибок такого рода?

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

1 ответ

Решение

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

Если две транзакции зашли в тупик, одна выживет. Руководство:

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

Ошибки сериализации происходят только в REPEATABLE READ или же SERIALIZABLE изоляция транзакции. Я бы не знал о каком-либо конкретном ограничении количества сбоев сериализации одновременно. Но я также никогда не слышал о необходимости откладывать повторные попытки.

Я бы повторил как можно скорее.

Другие вопросы по тегам