2010-03-25 27 views
0

我有一個應用程序,即同時訪問的用戶數量。 那些正在訪問應用程序的用戶獲得相同的ID。如何處理ASP.NET中的數據併發?

在這裏,我在代碼中做的是,當他們創建新用戶時,我從數據庫獲取最大ID並將值增加到1. 以便他們獲得相同的ID。所以我在這種情況下面臨併發。

如何解決這個問題。

當用戶點擊NewUser時,我需要顯示不同的數字。

我使用的SQL Server 2008和.NET 3.5和C#.NET

在此先感謝。

+0

我不清楚有什麼問題。你想讓兩個不同的用戶擁有不同的ID嗎?你將什麼樣的信息存入數據庫? – mamoo 2010-03-25 13:52:57

+0

是的,我想使用不同的ID。 但問題是 當用戶點擊NewUser時,我不是在數據庫中創建新用戶。我只是從數據庫中取出Max id,並用1增加它。並用此值顯示UserId字段。 所以,當兩個用戶點擊NewUser時,他們得到相同的號碼 謝謝 – Itsgkiran 2010-03-26 07:48:40

+0

如果你沒有將它保存在數據庫中,這個ID的作用是什麼? – jaywon 2010-03-26 09:10:47

回答

0

您可以使用SCOPE_IDENTITY 這將解決您的問題!

UPDATE

如果你的ID是不是一個IDENTITY列,您仍可以從對插入數據庫中獲取它 - 用一個單一的數據庫調用。

例如:

解決方案1 ​​

DECLARE @MyID varchar -- could be an uniqueidentifier (GUID) as well 
SET @MyID = GetNextID() -- a function that returns IDs 

INSERT INTO [myTable] ([myData], [MyID]) 
VALUES(@myData, @MyID) 

SELECT @MyID 

解決方案2:(用於SQL Server 2008)

INSERT INTO [myTable] ([myData], [MyID]) 
VALUES(@myData, GetNextID()) 
OUTPUT INSERTED.* 

(該OUTPUT語句將返回新插入的記錄 - 您也可以僅返回的ID列)

-HTH

3

這是一個常見的問題,但很容易解決..

  1. 更改用戶表,以便當您插入新的用戶ID是標識列
  2. 用戶詳細信息放入此表中SQLServer會自動爲您創建一個新的唯一用戶標識
  3. 要獲取爲您創建的用戶標識,請使用SCOPE_IDENTITY()函數

有關標識列,以及如何獲取新用戶標識的更多信息,看看這個教程..

SQLTeam - Understanding Identity Columns

編輯(基於下面的評論)

原因您目前正在獲取重複的用戶ID,因爲您在請求最大(用戶ID)和更新它/插入新用戶記錄之間有時間差距。

如果此延遲(請求和更新之間)爲10分鐘或10毫秒,則無關緊要,如果您的網站受到足夠的打擊,問題仍會發生。

通過使用標識列,SQLServer通過爲您創建標識來有效地消除延遲。沒有其他進程/用戶可以被賦予相同的用戶ID。

嘗試用下面的代碼...

/*Create Table*/ 
    CREATE TABLE TestTableSO (UserID INT IDENTITY(1,1), Username NVARCHAR(50)) 

    /*Insert some data, note that I'm not providing a UserID on my Insert*/ 
    INSERT INTO TestTableSO (Username) VALUES ('Joe') 
    INSERT INTO TestTableSO (Username) VALUES ('Dan') 
    INSERT INTO TestTableSO (Username) VALUES ('Fred') 
    INSERT INTO TestTableSO (Username) VALUES ('Sam') 

    /*Look at the data I've inserted*/ 
    SELECT * FROM TestTableSO 

    /*Insert one more record*/ 
    INSERT INTO TestTableSO (Username) VALUES ('Roger') 

    /*Look at the new UserID I have been given by SQL Server*/ 
    SELECT SCOPE_IDENTITY() as NewUserID 

    /*Drop our table, only needed for testing*/  
    DROP TABLE TestTableSO 

從這個代碼,你會得到下面的輸出...

UserID Username 
------------------ 
1  Joe 
2  Dan 
3  Fred 
4  Sam 

NewUserID 
----------- 
5 

希望這是有道理的!再次重申。您將無法以您的方式使用Max(UserID) 解決此問題。

編輯#2

沒有存儲任何信息,去與用戶ID創建用戶ID是BAD想法。由於會訪問您的網站的用戶,獲得用戶ID但未填寫任何詳細信息,您可能會很快冒用可用ID。如果他們是真正的用戶,只給他們提供用戶名。

+0

當用戶點擊NewUser時,我不是在數據庫中創建新用戶。我只是從數據庫中取出Max id,並用1增加它。並用此值顯示UserId字段。因此,當兩個用戶點擊NewUser時,他們得到相同的號碼 謝謝 – Itsgkiran 2010-03-26 07:47:58

+0

ID不是一個數字它是一個varchar,那麼我們也可以這樣做 – Itsgkiran 2010-03-26 09:16:53

+0

爲什麼你的ID是一個varchar?它是由數字和字母組成的嗎? – CResults 2010-03-26 09:21:25

相關問題