Подтвердить что ты не робот

Последовательности, не затронутые транзакциями?

У меня есть таблица

create table testtable(
  testtable_rid serial not null,
  data integer not null,
  constraint pk_testtable primary key(testtable_rid)
);

Так что скажем, что я делаю этот код примерно 20 раз:

begin;
insert into testtable (data) values (0);
rollback;

а затем я делаю

begin;
insert into testtable (data) values (0);
commit;

И, наконец,

select * from testtable
Result:
row0: testtable_rid=21 | data=0
Expected result:
row0: testtable_rid=1 | data=0

Как вы можете видеть, на последовательности не влияют откаты транзакций. Они продолжают увеличиваться, как если бы транзакция была совершена, а затем строка была удалена. Есть ли способ предотвратить последовательность действий таким образом?

4b9b3361

Ответ 1

Было бы нецелесообразно откатывать последовательности. Представьте себе две транзакции, происходящие одновременно, каждая из которых использует последовательность для уникального идентификатора. Если вторая транзакция совершает транзакцию и первая транзакция возвращается назад, вторая вставляет строку с "2", а первая переводит последовательность обратно в "1".

Если эта последовательность будет использоваться снова, значение последовательности станет "2", что может привести к уникальной проблеме ограничения.

Ответ 2

Нет, нет. См. Примечание внизу на этой странице. Это плохая идея сделать что-то подобное в любом случае. Если у вас одновременно две транзакции, каждая вставка одной строки, вы хотите, чтобы они вставляли строки с разными идентификаторами.