因此,我们正在处理信用卡付款,每笔付款都需要一个唯一的参考ID。我们正在使用MySQL。
有一个payments
表,它有一个自动递增的主键id,processing_date,created_at,updated_at。我的问题是,在处理完付款之后,此记录不能保留(由于应用程序工作流程,此过程无法更改)。因此,我们不能简单地使用主键,因为在处理完付款之后它才会存在,并且之后添加了一个具有唯一约束的reference_id
列。
我的问题是,有没有一种可靠的方法来生成基于现有表格列的顺序(或接近)数字(即使用MAX(reference_id) + 1
之类的东西),处理付款(使用curl)然后插入使用先前生成的reference_id
将付款记录放入表中,同时确保唯一性。基本上保留以前生成的reference_id与数据库。
答案 0 :(得分:2)
不要尝试将其基于现有列。如果您同时获得2笔交易,则最终可能会有2笔具有相同ID的交易。
将其基于UUID或时间戳。
我有一个类似的系统,交易ID是MMDDYYHHMMSS + 8位随机数。这对于小批量交易是可以的,并且在1秒内不太可能有2个或更多重复交易。
许多网关使用相同的方案。
UUID是最安全的,因为它保证它是全球唯一的。
答案 1 :(得分:1)
您可以将另一列添加到付款表中作为状态/已确认标记。付款开始时,您插入值并将状态设置为“已启动”(或其他),这样您就可以使用自动生成的ID。
付款完成后,您可以将标记设置为“已完成”。如果付款被拒绝,请删除该行。
为了优化这一点,您还可以创建一个每晚运行的内务处理程序,并删除状态为“已启动”且超过2天或类似情况的行。
答案 2 :(得分:1)
您需要为reference_id添加一个额外的表,并在每次需要新号码时更新此值。在交易中包裹所有内容并保存。使用MySQL变量可以使SQL变得非常简单:
CREATE TABLE reference_id(
id INT NOT NULL
);
INSERT INTO reference_id (id) VALUES (1);
REVOKE INSERT, DELETE, TRUNCATE FROM [all users];
- 真正的工作:
BEGIN; SET @i = 0; SELECT id + 1 INTO @i FROM reference_id FOR UPDATE; UPDATE reference_id SET id = @i; INSERT INTO other_table(ref_id, content) VALUES(@i, 'bla'); COMMIT;
由于锁定,您不会遇到并发性的完整性问题,即使在ROLLBACK之后也是如此。但用户可能不得不等待。