Параллелизм базы данных веб-приложений

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

Джимми

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
2
0
2 687
4

Ответы 4

Все, что тебе нужно:

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

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

Если вы пытаетесь предотвратить дублирование, самый простой ответ - создать УНИКАЛЬНЫЙ индекс для столбца, который вы хотите сделать уникальным.

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

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

Обновлено: все примеры отличные, но они не помогут, например, если он использует SubSonic.

Фактически, для случая INSERT уникальные индексы будут работать независимо от библиотеки базы данных.

Brannon 06.12.2008 04:12

В случае UPDATE я надеюсь, что большинство библиотек поддерживают оптимистичный параллелизм. Конечно, ADO.NET, но LINQ to SQL тоже. Я не могу говорить о Subsonic, но я считаю, что вы могли бы закодировать проверку Timestamp в своих Subsonic-запросах ... дайте мне знать, если это не так.

Brannon 06.12.2008 04:13

Брэннон - это было моей точкой зрения, если он использовал инструмент ORM, он, вероятно, имел дело с параллелизмом. Как это для быстрого ответа! Только что заметил голос "против".

Joe Ratzer 11.03.2010 18:33

Чтобы предотвратить одновременную ВСТАВКУ одних и тех же данных, используйте уникальный индекс для столбцов, которые вы хотите сделать уникальными. Первый 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();

Другие вопросы по теме