Возможно ли откат обеих транзакций во время тупика или ошибки сериализации?
В PostgreSQL (и других базах данных MVCC) транзакции могут откатываться из-за тупиковой ситуации или ошибки сериализации. Предположим, что в настоящее время выполняются две транзакции. Возможно ли когда-нибудь, что вместо одной транзакции произойдет сбой из-за ошибок такого рода?
Причина, по которой я спрашиваю, состоит в том, что я пишу повторную реализацию. Если обе транзакции могут потерпеть неудачу, мы можем оказаться в бесконечном цикле повторных попыток, если обе повторятся немедленно. Если может произойти сбой только одной транзакции, я не вижу никакого вреда при повторной попытке как можно скорее.
1 ответ
Да. Тупик может включать более двух транзакций. В этом случае более одного может быть прекращено. Но это крайне редкое состояние. Обычно.
Если две транзакции зашли в тупик, одна выживет. Руководство:
PostgreSQL автоматически обнаруживает тупиковые ситуации и разрешает их, прерывая одну из задействованных транзакций, позволяя другим завершить.
Ошибки сериализации происходят только в REPEATABLE READ
или же SERIALIZABLE
изоляция транзакции. Я бы не знал о каком-либо конкретном ограничении количества сбоев сериализации одновременно. Но я также никогда не слышал о необходимости откладывать повторные попытки.
Я бы повторил как можно скорее.