Там нет волшебной пули.
Автоинкрементные номера идентификаторов не будут работать, потому что при откате транзакции вы получите пробел.
Код приложения вне транзакции не будет работать, поскольку он не может гарантировать, чтопорядок «последовательности» будет соответствовать порядку «создан».
Выполнение всей работы в рамках одной сериализуемой транзакции будет работать, но определенно повлияет на производительность.Влияет ли это на производительность так сильно, что его нельзя использовать - вопрос открытый;проверить и измерить.
Так что-то вроде этого (PostgreSQL) должно работать, но может быть недостаточно быстрым.(Возьмем приведенное ниже время с небольшим количеством соли. Никаких одновременных пользователей, небольшие таблицы.)
set transaction isolation level serializable;
begin;
insert into obj (sequence, time_created)
select min(n), current_timestamp
from serial_integers where time_stamp is null;
-- 0.125ms
update serial_integers
set time_stamp = current_timestamp
where n = (select min(n)
from serial_integers where time_stamp is null);
-- 0.161ms
commit;
-- 15ms
На практике я бы протестировал оборачивание этого в функцию (хранимую процедуру), частично для устраненияподзапрос в операторе UPDATE.