POS(购物车)——单笔交易中的多个项目

POS (Shopping Cart) - Multiple items in a single Transaction No

我正在创建一个类似 POS 的系统,我不太确定如何执行购物车部分,其中在收银员输入所有客户的商品(来自库存 table)后,输入的商品将有一个交易 #,就像我们在收据中看到的一样。

我应该在购物车 table 中添加一个 Trans_No 栏吗?如果是,我将如何处理将单个 Trans_No 分配给多个项目?我正在考虑获取最后一个 Trans_No 并将其递增到 1,然后将其分配给收银员购物车中的所有商品。但是,如果 2 个收银员同时使用该系统,则很有可能他们都检索到相同的最新交易 # 并将其同时增加到 1,从而导致将 2 个客户的订单合并为 1 个 transaction/receipt.

处理此问题的最佳方法是什么?

您的交易 ID 所在的数据对象取决于您的应用程序的功能要求。如果购物车中的任何东西都应该共享一个交易 ID,那么购物车 table 就是交易 ID 的正确位置。

数据库系统提供了多种功能来防止您描述的并发增量问题。避免这种情况的最简单方法是使用提供的 serial 数据类型,例如通过 PostgreSQL。如果您将列声明为序列,数据库将注意为您插入的每条记录生成一个新值。

如果没有这样的数据类型可用,可能仍然存在为记录生成唯一主键的机制。例如 MySQL 的 auto_increment 指令。

如果所有这些都不适合您,例如因为你想要一些奇特的逻辑来生成你的事务 ID,所以需要将读取、递增和存储值的逻辑包含在数据库事务中。像

这样的语句
start transaction;
select key from current_key;
update current_key set key = :key + 1;
commit;

将防止键值冲突。但是,请确保您的交易很短,尤其是在等待用户输入期间不要让交易处于打开状态。否则,其他用户的交易可能会被阻塞太久。