0

我目前正在与电子商务购物网站合作。用户可以随时随地提交订单是完全没有必要的。

我在 MySql 数据库中有两个表orderorder_details还有其他表)来维护我们可以轻松想象的订单细节,因此我认为,我不需要描述这两个表的整个结构。

order表基本上包含诸如order_id自动递增主键的字段order_dateorder_status以及我们在此上下文中不需要的其他一些字段。

order_details表基本上包含表的order_id外键字段。orderproduct_nameproduct_price

当客户提交订单时,要进行的第一个条目在order表中,并基于order_id此表中的内容,将订单的详细信息插入到order_details表中。

插入到表中需要从订单表中获取order_details适当的值(它是自动递增的,因此我们不能提前获得它)。我目前正在从类似这样的表中获取它。order_idorder_idorder

select max(order_id) from order;

该 SQL 语句为我提供order_idorder表中的最新信息,并且使用该值,我可以将特定订单的详细信息插入到order_details表中。

现在,假设我当前正在提交包含购物车中一些产品的订单。我的订单已order成功插入表中,但在插入之前(以及在从表中order_details检索最大值 之前),由于某些原因,服务器上的操作系统调度程序关闭了此过程,以执行另一个客户的订单并处理该订单另一个客户的订单已完全完成(插入到两个表中,the和 the )。order_idorderorderorder_details

完成此订单处理(另一个客户的订单)后,我的仍待处理的订单开始执行,该订单在从表中检索最大值之前被关闭。 上面的SQL语句执行时,会从与其他客户的订单相关的表中取出与我的订单无关的表,导致交易状态不一致order_idordermax order_idorder

我想问的是,如何正确地order_idorder表中获取一个始终与特定订单相关的适当的数据,并保证任何事务在任何时候都不会以不一致的状态结束。这样做的正确方法是什么?

4

1 回答 1

1

MySQL 的LAST_INSERT_ID()函数将从INSERT当前连接上最后一个操作的第一次成功插入返回自动递增的值。

您的 MySQL API 通常会为这个函数调用提供一些包装器,例如mysql_insert_id()在 PHP 中。

于 2012-05-09T15:08:09.530 回答