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

У меня есть стол

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
Результат:
row0: testtable_rid=21 | Данные =0
Ожидаемый результат:
row0: testtable_rid=1 | Данные =0

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам