我目前正在与电子商务购物网站合作。用户可以随时随地提交订单是完全没有必要的。
我在 MySql 数据库中有两个表order(order_details还有其他表)来维护我们可以轻松想象的订单细节,因此我认为,我不需要描述这两个表的整个结构。
该order表基本上包含诸如order_id自动递增主键的字段order_date,order_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_id了order表中的最新信息,并且使用该值,我可以将特定订单的详细信息插入到order_details表中。
现在,假设我当前正在提交包含购物车中一些产品的订单。我的订单已order成功插入表中,但在插入之前(以及在从表中order_details检索最大值 之前),由于某些原因,服务器上的操作系统调度程序关闭了此过程,以执行另一个客户的订单并处理该订单另一个客户的订单已完全完成(插入到两个表中,the和 the )。order_idorderorderorder_details
完成此订单处理(另一个客户的订单)后,我的仍待处理的订单开始执行,该订单在从表中检索最大值之前被关闭。 上面的SQL语句执行时,会从与其他客户的订单相关的表中取出与我的订单无关的表,导致交易状态不一致!order_idordermax order_idorder
我想问的是,如何正确地order_id从order表中获取一个始终与特定订单相关的适当的数据,并保证任何事务在任何时候都不会以不一致的状态结束。这样做的正确方法是什么?