2011-02-23 17 views
0

所以我們正在處理信用卡付款,每筆付款都需要一個唯一的參考ID。我們正在使用MySQL。您能保證mysql中的唯一序號嗎

有一個payments表,其中有一個自動遞增主鍵id processing_date,created_at,updated_at。我的問題是,直到付款處理完成後才能保存此記錄(由於應用程序工作流程,此過程無法更改)。由於這個原因,我們不能簡單地使用主鍵,因爲直到付款處理完成之後它纔會存在,並且因爲添加了具有唯一約束的reference_id列。

我的問題是,有沒有一種可靠的方法,可以根據現有的表格列(即使用諸如MAX(reference_id) + 1之類的東西)生成順序(或接近)號碼,處理支付(使用捲曲),然後將支付記錄插入該表與以前生成的reference_id同時確保唯一性。基本上保留先前生成的reference_id與數據庫。

回答

1

您可以將另一列添加到付款表中作爲狀態/確認標誌。當付款開始時,您插入值並將狀態設置爲「開始」(或其他),這樣您就可以使用自動生成的ID。

付款完成後,您可以將標誌設置爲「已完成」。如果付款被拒絕,請刪除該行。

爲了優化這一點,您還可以創建一個每天晚上運行的內務處理過程,並刪除狀態爲「已啓動」且超過2天或類似情況的行。

+0

這與我們目前正在考慮的方法類似。 – xzyfer 2011-02-23 00:45:36

2

不要試圖將其建立在現有列之上。如果您同時獲得2筆交易,則最終可能會有2筆交易使用相同的ID。基於UUID或時間戳。

我有一個類似的系統,交易ID是MMDDYYHHMMSS + 8位隨機數。對於低量交易這是可以的,並且在1秒內不太可能有2個或更多的重複交易。

許多網關使用相同的方案。

UUID是最安全的,因爲它保證它是全球唯一的。

+0

生成唯一號碼不是問題,它確保它們是順序的。在序列中可以跳過元素(有理由)。這可能會排除任何隨機數的使用。 – xzyfer 2011-02-23 00:17:09

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之後。但用戶可能需要等待。