2013-12-08 53 views
1

我有一个策略实体,根据MySQL中的整数列自动生成一个id。事情可行,但在测试异常和相关回滚时,我注意到MySQL不会重置最后增加的值。如何控制自动增量ID?

所以一个成功的保存生成实体ID 1 尝试保存获取实体ID 2但回滚。 然后成功保存一个新实体获取实体ID 3.

因此,在表中我们有两个记录。一个用id 1,另一个用id 3。

有没有什么办法可以控制这个?基本上,在我刚刚描述的场景中,我希望看到两个实体:一个id设置为1,另一个id设置为2.

+0

阅读此:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html –

+0

通常一个不想要你想要的。假设您想要记录关于回滚的实体(复杂事务的一部分)的一些关键信息。以后会有一个独特的日志条目,这一点非常重要。 –

回答

1

自动递增数字必须是唯一的,但它们不必是连续的。它们是单调增加的,只是它们实现的巧合。

您可以随时插入特定值并绕过自动递增机制。但是你必须知道“下一个”值是多少。为避免竞争条件,您必须锁定表格,查询MAX(id)+1,然后插入该值。

而这正是MySQL自己也必须这样做的。

自动递增工作的方式现在允许在没有竞争条件的情况下实现最大的并发性。因此,设计时,它会不时地“丢失”一些值,当您回滚INSERT时,或者如果您随后删除了某个值。

2

不,您不能改变这种情况。这就是应该如此。

自动增量ID必须是唯一的。就这样。

-1

您可以使用自己的自动增量逻辑处理它。 有一个Max + 1 idgenerator或有一个表维护这些表的PK自动生成的ID。 这样

LASTKEY表名 1 TableX的 5 TableY

每次一个表,你会从这个表来查询,以获得递增的ID。

+0

感谢您的想法,但我认为这只适用于单一连接。只要我们有两个并发事务要求下一个ID,我们就会遇到问题。 – jacekn