Объединение кода, основанного на разных уровнях изоляции транзакций в Postgres - PullRequest
0 голосов
/ 30 ноября 2018

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

Если они имеют одинаковый уровень изоляции транзакций, то проблем нет.Теперь, если они этого не делают, есть ли еще способ, которым я мог бы «правильно» комбинировать транзакции?

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

1 Ответ

0 голосов
/ 30 ноября 2018

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

В значительной степени существует риск того, что более высокий уровень изоляции будет отлавливать больше ошибок сериализации (например, 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 должен обнаружить их и сломать мертвую блокировку (после которой неудачная транзакция должна повториться), но если вы можете, вы всегда должны пытаться написать свое приложение, чтобы в первую очередь не существовало мертвых блокировок.Как правило, основной способ избежать мертвой блокировки - это убедиться, что все приложения, которые получают любые блокировки (явные или явные блокировки), получают эти блокировки в согласованном порядке.

Возможно, вам придется проявить особую осторожность, если ваше приложениенеобходимо отправлять запросы в другую внешнюю службу, поскольку вам может потребоваться проверить, не приведет ли повторная попытка сделать нежелательные повторяющиеся запросы, особенно если эти внешние запросы не являются идемпотентными.

...