Php 如何保证并发线程在MYSQL中不会获得相同的值?

Php 如何保证并发线程在MYSQL中不会获得相同的值?,php,mysql,sql,innodb,Php,Mysql,Sql,Innodb,假设我的订单表的最后一行是 Order_ID Product 555 Apple 我如何确保在同一时间发生的两个订单不会在下一个订单中获得相同的订单ID,即556,因为这就是发生在我身上的情况。我的桌子使用INNODB 实际上,Order_ID是一个自动递增字段。我正在使用Show Table Status查询并使用[Auto increment]获取下一个Order\u iD。有什么建议吗?使用属性定义Order\u iD列,并让MySQL为您分配值(在成功插

假设我的订单表的最后一行是

Order_ID      Product
  555          Apple
我如何确保在同一时间发生的两个订单不会在下一个订单中获得相同的订单ID,即556,因为这就是发生在我身上的情况。我的桌子使用INNODB


实际上,Order_ID是一个自动递增字段。我正在使用Show Table Status查询并使用[Auto increment]获取下一个Order\u iD。有什么建议吗?

使用属性定义
Order\u iD
列,并让MySQL为您分配值(在成功插入后,您可以通过向驱动程序询问
最后一次插入\u iD
来检索该值):

ALTER TABLE orders MOFIF Order\u ID BIGINT UNSIGNED NOT NULL自动增量;
然后,要插入记录,您只需不提供
Order\u ID
值,它将自动分配:

插入订单(产品)值(“苹果”);

我相信您是在“硬编码”订单\u id+1

请在您的表格中使用自动增量,它将保证您不会重复任何订单


在您的情况下,复制一个表(备份),更改表并添加一个自动增量,然后再次导入

在MyISAM中使用表锁,在INNODB中使用行锁INNODB不是默认情况下由INNODB实现的行锁吗?不,您必须实现它,读@wisdom:这确实是个问题。@wisdom我认为order\u ID是一个整数值,您还可以将integer+something组合在一起以保持唯一的IDok,只需查看555并不意味着integer和二阶ID中的数据类型应该是char+int的组合,以确保可靠和未来安全implementation@wisdom:“即下一个订单的556”-表示订单是按顺序编号的整数。如果有人希望“为了实现和未来的安全”(不管你是什么意思)有一个“Char+INT”的PK,那么将Char部分存储在一个单独的列中,我没有要插入的内容来获取最后一个插入id。在插入任何内容之前,我需要最后一个插入id。实际上,订单id是一个自动递增字段。。。。???我正在使用Show Table Status查询和[Auto increment]获取下一个订单iD。有什么建议吗?@ManishPradhan:你可以尝试阅读jcho360和我在答案中链接的手册页…@ManishPradhan如果你有一个自动递增字段,那么
last\u insert\u iD
就可以了need@ManishPradhan我没听清你的问题,你需要一个自动增量来避免重复的值,您需要使用
alter table xxx
来修改结构,以及wisdom said
last\u insert\u id
将如何获得最后一个insertedOK,我将尝试最后一个insert id,看看问题是否得到解决。谢谢