Что приводит к тому, что последовательность postgresql не синхронизируется с идентификатором таблицы в приложении rails? - PullRequest
0 голосов
/ 18 июня 2019

Недавно у меня был очень неприятный опыт последовательности postgresql, не синхронизированной с идентификатором таблицы в приложении rails .Пока это не произошло, «магия» рельсов означала, что я никогда не знал, что такое последовательность postgresql - это всегда происходило автоматически.Еще более тревожно, я даже не знал, когда я вызвал эту проблему «несинхронизации» (только когда были созданы более поздние записи, ошибки были выброшены)

Мне удалось пробратьсячерез драму.Но теперь я хочу понять все возможные причины такой серьезной проблемы, как последовательность postgresql, не синхронизированная с идентификатором в таблице rails.Я хочу знать это, чтобы избежать этого в будущем.

Я вызвал это, создав новые записи вручную , где я указал идентификатор .Например, User.create(id: 4566, name: "Jo", email: "jo@gmail.com") (важно, что создание записи без без указания идентификатора позволило бы избежать проблемы т.е. User.create(name: "Jo", email: "jo@gmail.com")

Мой вопрос: помимо указания идентификаторов вВновь созданные записи, что еще нужно знать разработчику rails, вызовет эту проблему?

1 Ответ

0 голосов
/ 18 июня 2019

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

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

Мой совет - не устанавливать явно идентификаторы в БД. Если вам нужен пользовательский идентификатор, используйте другой столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...