doctrine2在无法插入记录时增加了我的主键

xan*_*ngr 2 php postgresql symfony doctrine-orm

可能重复:
如果在PostgreSQL中插入失败,有没有办法避免调用nextval()?
Rails - Postgres不会重复使用已删除的ID但是MySql会这样做吗?

我有一个非常简单的数据库与PostgreSQL 9.2.1.当我使用此方法插入Doctrine2的东西时:

$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

如果我收到错误

-means记录 inserted-

它仍然添加1到我的主键.因此,如果我刷新页面50时间,则表示自动增量值设置为50.我怎么能阻止这个?如果记录没有说明为什么主键增加.这非常关键,因为它使用索引,而且数量不断变大.

我不知道它是什么来的,为什么,所以,我没有尝试任何东西.此时非常困难.

Ale*_*lex 5

Doctrine2使用事务来完成它的任务.

每次Doctrine将其更改刷新到数据库时,它都会打开一个事务,每个记录都准备好,然后提交将立即执行所有更改.

在此过程中,将auto_increment分配需要ID 的记录.如果记录在提交阶段失败,则不会添加记录,但自动增量已发出该ID.

您可以在此处阅读有关交易的更多信息:http://www.postgresql.org/docs/current/static/tutorial-transactions.html

注意:对于MySQL也是如此,我确信对于许多其他RDBMS也是如此.

  • 它实际上是并发下序列操作的本质,而不是事务上下文的存在,这是关键.即使没有事务,当插入失败时重置序列的最后一个值也是不可取的,因为另一个并发活动可能已经提前了它. (2认同)