Каков наилучший способ управления параллелизмом в приложении для доступа к базе данных? - PullRequest
8 голосов
/ 13 января 2011

Некоторое время назад я написал приложение, используемое несколькими пользователями для создания сделок.Я давно не занимался разработкой, и я не могу вспомнить, как мне удалось обеспечить параллелизм между пользователями.Таким образом, я ищу несколько советов с точки зрения дизайна.

Исходное приложение имело следующие характеристики:

  • Один тяжелый клиент на пользователя.
  • Единая база данных.
  • Доступ к базе данных для каждого пользователя для вставки / обновления / удаления сделок.
  • Сетка в приложении, отражающая таблицу сделок.Эта сетка обновляется каждый раз, когда кто-то меняет сделку.
  • Я использую WPF.

Вот что мне интересно:

  1. Правильно ли я считаю, что мне не нужно заботиться о подключении к базе данных для каждого приложения?Учитывая, что в каждом из них есть синглтон, я ожидаю, что одно соединение на клиента не вызывает проблем

  2. Как я могу предотвратить параллелизм доступа?Я думаю, что я должен заблокировать при изменении данных, однако не помню, как это сделать.

  3. Как настроить сетку для автоматического обновления при каждом обновлении моей базы данных (например, другим пользователем)?

Спасибозаранее за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Параллельность обычно предоставляется СУБД с использованием блокировок.Блокировки - это тип семафоров, которые предоставляют эксклюзивную блокировку определенному ресурсу и позволяют другим доступам быть ограниченными или помещенными в очередь (ограничено только в случае, если вы используете незафиксированные чтения).

Количество соединений, которые само по себе не создаетпроблема, когда вы не достигли высот, когда вы можете коснуться настройки max_connections в вашей СУБД.В противном случае может возникнуть проблема с подключением к нему в целях обслуживания или для его отключения.

СУБД обычно используют концепцию блокировок таблиц (MyISAM) или блокировок строк (InnoDB, большинство других СУБД).Тип замка определяет объем замка.Блокировки таблиц могут быть очень быстрыми, но обычно считаются уступающими блокировкам на уровне строк.

Блокировки на уровне строк происходят внутри транзакции (неявной или явной).При ручном запуске транзакции вы начинаете свою область транзакции.Пока вы вручную не закроете область транзакции, все внесенные вами изменения будут являться атрибутами этой конкретной транзакции.Внесенные вами изменения будут также соответствовать парадигме ACID .

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

Для автоматических обновлений большинство баз данных поддерживают некоторый механизм триггера, который представляет собой код, который выполняется при определенных действиях с базой данных (например, создание новой записи илиизменение записи).Вы можете разместить свой код внутри этого триггера.Однако вы должны только информировать получающее приложение об изменениях, а не «вносить» изменения из триггера, даже если язык может сделать это возможным.Помните, что действие, которое вызвало код, приостанавливается до тех пор, пока вы не закончите с кодом триггера.Это означает, что лучше использовать постный триггер, если он вообще нужен.

2 голосов
/ 13 января 2011
  1. Подумайте об использовании пула соединений, чтобы уменьшить количество соединений.См .: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  2. заблокируйте как можно позже и отпустите как можно скорее, чтобы максимизировать параллелизм.Вы можете использовать TransactionScope (см .: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx и http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx), если у вас есть несколько действий с БД, которые необходимо объединить для управления согласованностью или просто обработать их в хранимой процедуре БД. Сделайте запрос простым.следующие советы, чтобы понять, как работает блокировка и как уменьшить конфликт ресурсов и тупик: http://www.devx.com/gethelpon/10MinuteSolution/16488

  3. Я не уверен, что другие БД, но для SQL вы можете использовать зависимость от SQL, см. http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

...