2013-10-05 29 views
1

使用c#和mssql 2008 R2,我有一個服務,插入一個用戶到系統中,用戶有一個唯一的編號分配給他們,就像a1,b1或c1,這將增加用戶插入,但插入之前,我有檢查是否有任何以前的唯一號碼可用(在刪除用戶時可以刪除唯一的號碼)。例如,如果數據庫中有5個用戶,則保留a1,...,a5,如果您刪除可以說第3個用戶,則a3將可用於下一個用戶插入。這可以很容易地完成,但因爲我必須讀取每個插入的可用唯一編號,所以我很困惑在插入前使用插入觸發器還是使用應用程序代碼更好?數據庫觸發器或應用程序代碼?我應該在這種情況下使用哪一個?

在此先感謝

回答

1

我不知道有關觸發器以及要如何做這種方式,但你絕對可以做到的是,在代碼/存儲過程。這將是一個2步驟的過程,將不得不在一個事務中:

  • 選擇最小可用ID
  • 插入新記錄

一個重要的事情是,你將要鎖定該表在選擇查詢期間阻止其他進程獲得相同的ID。你可以使用排他鎖提示來做到這一點。該代碼可能看起來像:

select min(T.ID) + 1 from TableName T with(xlock) 
    where not exists (select * from TableName T1 where T1.ID = T.ID + 1) 
+0

感謝您的回覆Szymon,我不要求的算法,但什麼我問的是這有任何性能差異,如果我使用觸發器或存儲過程,而不是代碼並將所有工作都放在數據庫本身上,而不是通過代碼? +1提到鎖。 –

+0

謝謝。我猜不管你使用哪一個你將不得不運行一個類似的代碼來獲得正確的ID。我會親自爲代碼/存儲過程,因爲它使整個事情變得更加複雜。 – Szymon

+1

是的你說的代碼是真的,我想知道在性能的情況下,雖然它沒有在這裏有任何明顯的區別,但作爲一個最佳實踐,我想知道:)謝謝。 –

相關問題