PostgreSQL Транзакция с идентификатором 15, вставленным перед идентификатором 16 - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот случай, например, у меня есть накладная таблицы, а затем обрабатывается транзакция 2 почти одновременно:

1. 12:55:11.21212 got id from postgresql 15
2. 12:55:11.24441 got id from postgresql 16

, но транзакция, вставленная в таблицу 16, сначала вставляется, затем ид 15 после этого, например,

id         time          trx
14   12:55:11.11231       A
16   12:55:11.24441       B

затем после refre sh таблицы, id с 15-кратной задержкой:

id         time           user
14    12:55:11.11231       A
15    12:55:11.21212       A
16    12:55:11.24441       A

почему это произошло?

1 Ответ

1 голос
/ 06 апреля 2020

Это совершенно нормально.

Во-первых, если вы получите отметку времени как current_timestamp или нестандартную now(), то это отметка времени, когда была запущена транзакция базы данных.

Если вы используете clock_timestamp(), который возвращает метку времени настенных часов, и вы автоматически генерируете первичный ключ с последовательностью (serial или bigint GENERATED ALWAYS AS IDENTITY), это сделает окно для состояния гонки намного меньше. Но все же может случиться, что процесс теряет ЦП между временем, когда он получает метку времени, и когда он генерирует значение последовательности, так что метка времени в двух строках заканчивается с порядком, отличным от первичного ключа.

Я рекомендую использовать первичный ключ или временную метку для определения порядка. Преимущество первичного ключа в том, что он уникален.

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