Управление соединениями с базой данных SQL во многих транзакциях - PullRequest
2 голосов
/ 31 июля 2009

у нас есть DAL, который должен обернуть множество вставок базы данных в одну транзакцию, которую мы можем откатить или зафиксировать.

Как лучше всего справляться с этим?

В настоящее время мы делаем следующее:

  1. Создание подключения к БД и транзакции
  2. Заполните коллекцию всеми классами, которые представляют действие, которое нужно выполнить. Передайте соединение через конструктор.
  3. В try / catch перебрать все классы действий и вызвать их метод Publish ()
  4. Фиксация в случае успеха (закрытие соединения) или откат в случае ошибки (закрытие соединения).

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

Это использует SQL 2008, .net 3.5 и версию 4.1 доступа к данным корпоративной библиотеки.

Ответы [ 3 ]

2 голосов
/ 31 июля 2009

Либо вы ошиблись, либо проблема может быть в том, что вы передаете SqlConnection методу публикации (а не передаете SqlTransaction).

SqlTransaction имеет свойство подключения, которое должны использовать все обновления.

Итак, вы хотите делать что-то вроде

// Create connection
SqlConnection connection = ObtainSqlConnection()

// Create transaction
SqlTransaction sqlTransaction = connection.BeginTransaction();

try
{    
    foreach (Action action in collectionOfActionsToPerform)
    {
        action.Publish(sqlTransaction)
    }

    sqlTransaction.Commit();
}
catch
{
    sqlTransaction.Rollback();
}

Попробуйте опубликовать псевдокод, если это недоразумение.

0 голосов
/ 21 августа 2009

Некоторые лучшие практики транзакций:

  • Сделайте транзакции максимально короткими
  • Доступ к как можно меньшему количеству данных в транзакции

С точки зрения Enterprise Library, DAAB осведомлен о System.Transaction, поэтому я бы использовал TransactionScope. Исходя из того, что вы сказали что-то вроде:

Database database = DatabaseFactory.CreateDatabase();

using (TransactionScope scope =
    new TransactionScope(TransactionScopeOption.RequiresNew))
{
    foreach(MyClass myClass in myClasses)
    {
         myClass.Publish(database);
    }

    scope.Complete();
}

В этом примере отсутствует обработка ошибок, и предполагается, что возникает исключение, если транзакцию необходимо откатить.

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

Вы пытались профилировать свои операторы SQL для обеспечения их эффективности. Также убедитесь, что вы не снимаете чрезмерные блокировки и не получаете проблем с блокировкой / блокировкой.

0 голосов
/ 31 июля 2009

Взгляните на реализацию, которую веб-сайт MySpace использует с технологией SQL Server.

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004532

Они используют SQL Server Service Broker для управления транзакциями базы данных в сотнях баз данных.

...