2016-03-01 185 views
0

林不知道的鑰匙複製如果標題描述我的問題, 我有需要使用一個唯一的密鑰與每個記錄,如下表答:避免數據庫插入

1.it從取鑰匙表格稱爲櫃檯(假設其爲500)。 2.it檢查表A中是否真的使用了最後一個值(這是因爲有人可能預訂了該值,然後未完成使用它)(如果使用增量值,否則取值)

商業智能過程通過2個步驟完成: 1.client點擊book id,以便他/她擁有密鑰。 2.client填補其餘的信息並保存,以便新行被插入到表A.

多個客戶可能會使用該系統的同時,讓他們的拖車可能預定值相同

假設用戶1預訂500,然後用戶2預訂500(用戶1還沒有使用它,所以用戶2將採取相同的密鑰),然後用戶1插入行到表A,然後用戶2插入行到表A

這種情況下會導致嚴重問題,因爲兩者都使用相同的密鑰,應該是唯一的

woul d請爲此建議一個解決方案

回答

0

那麼我首先會重新考慮你的解決方案的架構,但是因爲那個答案太無聊了,所以我也會嘗試更具建設性。

你想要看的是「交易」。事務鎖定一張表供其他人使用,然後啓動交易。這在諸如座位數量有限的預訂系統和系統可能缺貨的在線商店等解決方案中大量使用。

該理論相當簡單,但實現可能需要一些才能正確。你也應該知道,你很可能會在你的一系列ID中出現「漏洞」。這意味着如果用戶A的書籍ID 500和用戶B的書籍ID 501,然後用戶A取消it's預訂,而無需創建一個記錄將不會有編號500

我覺得我的做法,您的問題將是

1:用戶在目標表中創建一條記錄,並獲得一個正常的主鍵增量ID。

2:創建並保存記錄後,邏輯請求從您描述的ID表中獲取「可視」ID。這是通過使用事務來確保可視ID是唯一的。

在實際創建記錄之前,您應該沒有真正有效的理由來預訂/創建ID。

取決於你的環境交易的實施方式不同。例如在MySQL中,你會做這樣的事情。

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

但是,如果您使用的是像Active Record或類似的ORM應該有一個方便的方法。

你也可以通過使用純SQL腳本來解決這個問題。 I.E:創建一個存儲過程來創建記錄,併爲其獲取新的可視ID。您仍然需要使用交易艱難。

+0

非常感謝你,我會考慮這一點 – Heba