交易中AUTO_INCREMENT的可靠性如何?

时间:2012-12-31 12:42:20

标签: mysql transactions auto-increment

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

2 个答案:

答案 0 :(得分:1)

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

1:保留下一个可用的自动增量键
2:使用此保留键执行插入

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

答案 1 :(得分:0)

如果您的插入发生在非常受控制的情况下,例如没有并发事务,并且没有任何内容被回滚,那么您可能是安全的。否则,答案可能取决于您使用的存储引擎。您应该期望auto_increment导致least if you are using InnoDB的编号出现空白。

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

如果您的关注是用户创建操作的高负载,您可以通过将该功能实现为存储过程来使事情变得更加快捷;通过这种方式,您可以避免针对每个查询回滚到应用程序。