Postgres 9.5 въведе нова функция, свързана с този проблем:времеви отпечатъци за ангажиране .
Просто трябва да активирате track_commit_timestamp
в postgresql.conf
(и рестартирайте!), за да започнете да проследявате времевите клеймца на ангажиментите. След това можете да направите заявка:
SELECT * FROM tbl
WHERE pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';
Прочетете главата „Проследяване на времеви клеймото за извършване“
в Postgres Wiki.
Свързана помощна програма функции в ръководството
.
Променливостта на функцията е само VOLATILE
защото идентификаторите на транзакции (xid
) може да се обвива по дефиниция. Така че не можете да създадете функционален индекс върху него.
Можете да фалшифицирате IMMUTABLE
нестабилност в обвивка на функция за приложения в ограничен период от време, но трябва да сте наясно с последиците. Свързан случай с повече обяснения:
- Поддържа ли PostgreSQL "нечувствителен към акцента " съпоставяне?
- Как ключовите думи IMMUTABLE, STABLE и VOLATILE влияят върху поведението на функцията?
За много случаи на употреба (като вашия?), които се интересуват само от последователността на ангажиментите (а не от абсолютното време), може да е по-ефективно да работите с xmin
прехвърляне към bigint
"директно" (xmin::text::bigint
) вместо времеви отпечатъци за ангажиране. (xid
е вътрешно цяло число без знак, горната половина не се вписва в integer
със знак .) Отново имайте предвид ограниченията, дължащи се на възможно обвиване на xid.
По същата причина клеймата за време на ангажимент не се запазват за неопределено време . За малки до средни бази данни, xid
wraparound почти никога не се случва - но в крайна сметка ще стане, ако клъстерът е жив достатъчно дълго. Прочетете главата „Предотвратяване на неуспешно обгръщане на ID на транзакция“ в ръководството за подробности.