Использование транзакций с ADO.NET Data Adapters - PullRequest
1 голос
/ 17 июня 2010

Сценарий: Я хочу разрешить нескольким (от 2 до 20, вероятно) серверным приложениям использовать одну базу данных с использованием ADO.NET. Я хочу, чтобы отдельные приложения могли владеть наборами записей в базе данных, хранить их в памяти (для скорости) в наборах данных, отвечать на запросы клиентов в отношении данных, выполнять обновления и предотвращать обновление этих записей другими приложениями до тех пор, пока они не станут собственниками был оставлен.

Я новичок в ADO.NET, но, похоже, это возможно при использовании транзакций с Адаптерами данных (слой ADO.NET отключен).

Вопрос часть 1: Это правильный способ попробовать и сделать это?

Вопрос часть 2: Если это правильный путь, может ли кто-нибудь указать мне на какие-либо учебные пособия или примеры такого подхода (в C #)?

Вопрос часть 3: Если я хочу иметь возможность владеть отдельными записями и выпускать их независимо, мне понадобится отдельная транзакция для каждой записи и, соответственно, отдельный DataAdapter и DataSet держать каждую запись, или есть лучший способ сделать это? Каждое приложение, вероятно, будет одновременно владеть тысячами записей.

Ответы [ 2 ]

1 голос
/ 18 июня 2010
  • Как долго вы хотели держать транзакцию открытой?
  • Сколько одновременно работающих пользователей вы собираетесь поддерживать?

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

Итак, мой ответ на первый вопрос: нет, это, вероятно, неправильный подход.

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

Я думаю, что лучший способ удовлетворить требования, как вы их сформулировали, - написать систему управления блокировками / проверкой записей. Мартин Фаулер называет это пессимистическим автономным замком .

UPDATE

Если вы используете SQL Server 2008, вы можете установить поведение повышения блокировки на уровне таблицы:

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

Это отключит эскалацию блокировки в «большинстве» ситуаций и может вам помочь.

0 голосов
/ 18 июня 2010

Вам действительно необходим контроль параллелизма, а также поддержка транзакций.

Transaction появляются только при выполнении нескольких операций над базой данных. Как только соединение освобождается, транзакция больше не применяется.

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

...