Последовательности, на которые не влияют транзакции?
У меня есть стол
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", что может привести к уникальной проблеме ограничения.
Нет, нет Смотрите примечание внизу этой страницы. В любом случае, это плохая идея. Если у вас одновременно выполняются две транзакции, каждая из которых вставляет одну строку, вы хотите, чтобы они вставляли строки с разными идентификаторами.