我正在创建一个类似POS的系统而且我不确定如何进行购物车部分,其中在收银员输入所有客户的项目(来自库存表)后,输入的项目将具有单个交易#,就像我们在收据中看到的一样。
我应该在Cart表中放入Trans_No列吗?如果是,我将如何处理将单个Trans_No分配给多个项目?我正在考虑获取最后一个Trans_No并将其增加到1,然后将其分配给casher购物车中的所有项目。但是,如果2个收银员同时使用该系统,他们都会检索相同的最新交易#并将其增加到1,从而将2个客户的订单合并为1个单一交易/收据。
处理此问题的最佳方法是什么?
答案 0 :(得分:1)
您的事务ID所在的数据对象取决于您的应用程序的功能要求。如果购物车中的任何内容应该共享一个交易ID,那么购物车表就是交易ID的正确位置。
数据库系统提供了多种功能来防止您描述的并发增量问题。避免这种情况的最简单方法是使用提供的serial
数据类型,例如通过PostgreSQL。如果将列声明为serial,则数据库将负责为您插入的每个记录生成新值。
如果没有可用的此类数据类型,则可能仍有一种机制可用于为记录生成唯一主键。一个例子是MySQL的auto_increment
指令。
如果所有这些对你不适用,例如因为您希望有一些生成事务ID的奇特逻辑,所以需要将读取,递增和存储值的逻辑包含在数据库事务中。语句如
start transaction;
select key from current_key;
update current_key set key = :key + 1;
commit;
将防止键值发生冲突。但是,请确保您的事务很短,特别是在等待用户输入期间不要保持事务处于打开状态。否则,其他用户的交易可能会被阻止太长时间。