2

我计划在我的网站上使用自动递增的用户 ID。由于用户数据将被拆分到多个表中,我想知道事务中自动递增值的可靠性如何,即在注册时将一些初始值插入事务中的表时,让自动递增器设置是否安全所有表中的 ID 还是应该只插入到一个表中,在单独的查询中获取插入的 ID 并在后续插入中使用它,从而导致更高的数据库负载仅用于用户创建?

4

2 回答 2

1

每次您尝试插入某些内容时,都会保留自动增量字段。插入或多或少分两步进行:

1:保留下一个可用的自增键
2:用这个保留的键执行插入

现在,如果事务回滚,唯一永远无法回滚的就是自增预留,导致自增列出现间隙。正因为如此,如果您试图 100% 预测自动增量将是多少,则不可能这样做。据我所知,auto_increment 没有其他问题,而且在几乎所有情况下,依赖 mysql 的功能比尝试手动执行某些操作更可靠。

于 2012-12-31T13:36:04.137 回答
0

如果您的插入发生在非常受控的条件下,例如没有并发事务,并且没有任何内容回滚,那么您可能是安全的。否则,答案可能取决于您使用的存储引擎。至少如果您使用 InnoDB ,您应该期望auto_increment在编号中产生空白。

更一般地说,我知道的每个数据库都有可能在auto_increment(或等效的)值中存在差距。原因是如果不是这样,任何插入新行的事务都必须阻止对该表的所有其他插入。这是因为如果第一个事务尚未提交或回滚,则无法知道下一个值将是什么时,无法插入第二行。如果您允许间隙,那么您只是假设第一个事务将提交,如果它碰巧回滚,您就有间隙,但这不是问题。

如果您担心用户创建操作的高负载,您可以通过将函数实现为存储过程来使事情变得更快捷;通过这种方式,您可以避免每次查询都返回到应用程序。

于 2012-12-31T12:57:31.480 回答