Каков наилучший способ управления параллелизмом в приложении доступа к базе данных?

StackOverflow https://stackoverflow.com/questions/4681280

Вопрос

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

Первоначальное приложение имело следующие характеристики:

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

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

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

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

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

Заранее благодарю вас за вашу помощь!

Это было полезно?

Решение

  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 Dependency, см. http://msdn.microsoft.com/en-us/library/a52dhwx7 (v=против 80).aspx

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

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

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

DBMS обычно использует концепцию блокировки любого таблицы (myisam) или блокировки строк (Innodb, большинство других DBMS). Тип блокировки определяет объем блокировки. Замок таблицы может быть очень быстрым, но обычно считаются худшими блокировками уровня строк.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top