В этой ситуации, да, как правило, вы можете объединить транзакцию в более ограничительный уровень изоляции.
В значительной степени существует риск того, что более высокий уровень изоляции будет отлавливать больше ошибок сериализации (например, ERROR: could not serialize access due to concurrent update
в REPEATABLE READ и ERROR: could not serialize access due to read/write dependencies among transactions
в SERIALIZABLE).Типичным способом обработки этих ошибок сериализации является повторение транзакций, но вы должны проверить, имеет ли это смысл в контексте вашего приложения.
Другая возможная ошибка, которая может возникнуть - это «мертвые» блокировки.Postgres должен обнаружить их и сломать мертвую блокировку (после которой неудачная транзакция должна повториться), но если вы можете, вы всегда должны пытаться написать свое приложение, чтобы в первую очередь не существовало мертвых блокировок.Как правило, основной способ избежать мертвой блокировки - это убедиться, что все приложения, которые получают любые блокировки (явные или явные блокировки), получают эти блокировки в согласованном порядке.
Возможно, вам придется проявить особую осторожность, если ваше приложениенеобходимо отправлять запросы в другую внешнюю службу, поскольку вам может потребоваться проверить, не приведет ли повторная попытка сделать нежелательные повторяющиеся запросы, особенно если эти внешние запросы не являются идемпотентными.