Последовательности, на которые не влияют транзакции? - PullRequest
25 голосов
/ 19 января 2010

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

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

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

Ответы [ 2 ]

35 голосов
/ 19 января 2010

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

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

5 голосов
/ 19 января 2010

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

...