Вложенные базы данных транзакций в C # - PullRequest
2 голосов
/ 21 апреля 2009

У меня есть базовый класс, который объявляет частную нестатическую ссылку на экземпляр DataBase Handler (DBH).

DBH - это класс, который мы используем для упрощения операций с базами данных производных классов. Он содержит обычные методы, такие как ExecuteScalar, StartTransaction среди других; и это обеспечивает дополнительные преимущества в контексте приложения, такие как кэширование и zero configuration.

Экземпляры производных классов используют DBH для чтения / сохранения своего состояния в базе данных, и, поскольку их операции не являются атомарными, все производные классы используют эту транзакцию. Все происходит в одном месте: виртуальный метод с именем InsertUpdate() объявлен в базовом классе.

Далее у меня есть коллекция (называемая Book) экземпляров производных классов. Я хочу принимать обновления коллекции как транзакцию.

Я хочу добиться чего-то похожего на это:

DatabaseHandler dbh = new DatabaseHandler()

t = dbh.StartTrasaction();
foreach( Type o in Book<Type> ) 
{
    o.prop1 = ..
    o.prop2 = ...
    o.method1() ...

    o.InsertUpdate(t);  // uses its own instance of DatabaseHandler and starts its own transaction
}
dbh.EndTransaction(t);

В настоящее время метод InsertUpdate не содержит параметров. Я думаю, мне придется ввести перегруженную версию, которая принимает объект транзакции.

Помимо решения моей текущей проблемы, есть ли какие-либо проблемы с дизайном, о которых мне нужно знать? Как я могу улучшить этот дизайн или создать лучший дизайн?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

Вы смотрели на пространство имен System.Transactions ? Если вы по какой-то причине еще не обесценили его, вы можете использовать встроенную поддержку вложенных транзакций, например:

  using (var scope = new TransactionScope())
  {
    // call a method here that uses a nested transaction
    someObject.SomeMethodThatAlsoUsesATransactionScope();

    scope.Complete();
  }
2 голосов
/ 22 апреля 2009

Убедитесь, что вы прочитали этот вопрос

Лично я обычно использую "свою собственную" реализацию объекта, подобного TrasactionScope, который переносит данные в TLS с дополнительным преимуществом наличия фабрики, которая позволяет легко профилировать и регистрировать.

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

0 голосов
/ 21 апреля 2009

Если все обновления происходят в одной и той же базе данных connectino, то вложенные транзакции будут работать как положено. Каждый InsertUpdate () будет запускать свою собственную транзакцию, а полная транзакция на dbh сможет откатить всю вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...