Как обработать параллелизм данных в ASP.NET? - PullRequest
0 голосов
/ 25 марта 2010

У меня есть приложение, которое одновременно обращается к нескольким пользователям.Те пользователи, которые обращаются к приложению, получают тот же идентификатор.

Вот что я делаю в коде, когда они создают нового пользователя, я получаю максимальный идентификатор из БД и увеличиваю значение до 1.Так что они получают одинаковое удостоверение личности.так что я столкнулся с параллелизмом в этой ситуации.

Как решить эту проблему.

Мне нужно отображать разные числа, когда пользователи нажимают на NewUser.SQL Server 2008 и .NET 3.5 и C # .NET

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 25 марта 2010

Это распространенная проблема, но ее легко исправить ..

  1. Измените вашу пользовательскую таблицу, чтобы идентификатор пользователя представлял собой столбец идентификаторов
  2. Когда вы вставляете ваши новые данные пользователя в эту таблицу, SQLServer автоматически создает для вас новый уникальный идентификатор пользователя
  3. Чтобы получить идентификатор пользователя, созданный для вас, используйте функцию SCOPE_IDENTITY ()

Дополнительную информацию о столбцах идентификаторов и о том, как получить новый идентификатор пользователя, можно найти в этом руководстве.

SQLTeam - Понимание столбцов идентификации

Редактировать (на основе комментариев ниже)

Причина, по которой вы в настоящее время получаете дубликаты идентификаторов пользователей, заключается в том, что у вас есть временной интервал между запросом max (userid) и его обновлением / вставкой новой пользовательской записи.

Неважно, будет ли эта задержка (между запросом и обновлением) 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

Создание идентификаторов пользователя без сохранения какой-либо информации для использования с идентификатором пользователя является идеей BAD . Вы рискуете исчерпать доступные идентификаторы намного раньше, потому что пользователи, которые будут заходить на ваш сайт, получают идентификатор пользователя, но не вводят никаких подробностей. Предоставляйте им ИД пользователя только в том случае, если они истинный пользователь.

0 голосов
/ 25 марта 2010

Вы можете использовать SCOPE_IDENTITY Это решит вашу проблему!

UPDATE

Если ваш идентификатор не является столбцом 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 с OUTPUT INSERTED.MyID)

-HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...