Совместное использование соединения и транзакции на уровне доступа к данным

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

Пример:

У меня 2 класса, Order и OrderDetail.

Я вызову свой класс DAL Order для вставки SQL нового заказа.

Внутри метода Insert я хочу вызвать свой класс OrderDetail, чтобы вставить детали моего заказа, и я бы сделал это с тем же соединением и транзакцией.

Может ли кто-нибудь предложить мне какой-нибудь архитектурный дизайн для этого? Или, может быть, кто-то может предоставить какой-нибудь ресурс в Интернете?

Надеюсь, пример понятен, мой английский - отстой!

Спасибо.


person opaera    schedule 08.08.2010    source источник
comment
Если какой-либо из ответов - это то, что вы искали, не могли бы вы отметить его как ответ?   -  person Ronald Wildenberg    schedule 11.08.2011


Ответы (1)


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

Лучший способ «поделиться» своей транзакцией - использовать TransactionScope класс. Он создает так называемую внешнюю транзакцию. Каждый SqlConnection, который вы открываете в рамках внешней транзакции, автоматически становится частью этой транзакции.

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

person Ronald Wildenberg    schedule 08.08.2010
comment
Спасибо, Рональд, мне кажется, TransactionScope - это то, что мне нужно. Это может быть нормально в классе Order, я вставляю заголовок Order, а затем несколько раз вызываю метод Insert моего OrderDetail для получения деталей, и все это внутри TransactionScope. Но я также мог бы напрямую вызвать метод Insert OrderDetail, когда я изменяю заказ для добавления детали, и в этом случае Insert OrderDetail должен иметь свою собственную транзакцию. Что об этом? Надеюсь, вы понимаете, о чем я. - person opaera; 08.08.2010
comment
Я понимаю вашу точку зрения, но вам не нужно предоставлять другую транзакцию внутри метода Insert OrderDetail, потому что эта транзакция уже доступна. Вы можете проверить это, вызвав Transaction.Current внутри этого метода. Вы увидите, что он возвращает транзакцию, даже если вы открыли ее внутри своего метода Order. - person Ronald Wildenberg; 08.08.2010
comment
Еще раз спасибо, Рональд. Я читал о TransactionScope и нашел эту статью: blogs.msdn.com/b/dbrowne/archive/2010/05/21/ О тайм-ауте и уровне изоляции, что вы предлагаете для приложения, в котором много операций вставки (в sql server 2008) готово? (например, создание каталога с тысячами товаров) - person opaera; 08.08.2010
comment
Предлагаю вам самостоятельно почитать об уровнях изоляции и свойствах ACID :) Вот хорошая отправная точка: en.wikipedia.org/wiki/Isolation_ (database_systems). Я полностью согласен с постом. Я почти никогда не использую Serializable из-за снижения производительности. Однако это зависит от вашего приложения. - person Ronald Wildenberg; 08.08.2010