Параллелизм базы данных веб-приложения - PullRequest
2 голосов
/ 05 декабря 2008

У меня есть веб-приложение (ASP.net 2.0) с базой данных (SQL Server) в фоновом режиме. Я рассматриваю способы обработки параллелизма в базе данных, если два пользователя одновременно вставляют одинаковые данные в одну и ту же таблицу. Есть ли способ справиться с этим делом? Заранее спасибо.

Jimmy

Ответы [ 4 ]

4 голосов
/ 05 декабря 2008

Чтобы предотвратить одновременную вставку одних и тех же данных, используйте уникальный индекс для столбцов, которые вы хотите быть уникальными. Первый INSERT будет успешным, обработайте ошибку для проигравшего INSERT соответственно.

Чтобы не допустить одновременного изменения 2+ пользователями одной и той же (существующей) записи, используйте оптимистичный параллелизм http://en.wikipedia.org/wiki/Optimistic_concurrency_control. В SQL Server легко реализовать оптимистичный параллелизм с использованием столбца TIMESTAMP. Прочитайте метку времени с вашими данными. При обновлении строки убедитесь, что значение метки времени совпадает. Если временные метки не совпадают, значит, пользователь имел (просматривал) устаревшую строку. Обращайтесь с этим делом соответствующим образом.

Пример использования SqlClient:

command.CommandText = @"
    UPDATE tbl
    SET LastName = @LastName, FirstName = @FirstName
    WHERE ID = @ID AND Timestamp = @Timestamp
    ";

int rowCount = command.ExecuteNonQuery();
if (rowCount != 1)
    throw new DBConcurrencyException();
1 голос
/ 05 декабря 2008

Если вы пытаетесь предотвратить дублирование, самый простой ответ - создать уникальный индекс для столбца, который вы хотите быть уникальным.

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

1 голос
/ 05 декабря 2008

Все, что вам нужно, это:

BEGIN TRANSACTION;
INSERT XXXXXX INTO TABLE1 ......
INSERT YYYYY  INTO TABLE2 ........
COMMIT;
if (commit_failed) { tell user to try again!; };

SQLserver позаботится об остальном.

0 голосов
/ 05 декабря 2008

Не зная, как ваш код C # взаимодействует с базой данных (O / R, ADO.NET ...), трудно дать вам полезный ответ ...

РЕДАКТИРОВАТЬ: все примеры великолепны, но они не помогут, если он, например, использует SubSonic.

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