Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Вебмастеру -> Сеппа Д. -> "Microsoft ADO.NET" -> 195

Microsoft ADO.NET - Сеппа Д.

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 189 190 191 192 193 194 < 195 > 196 197 198 199 200 201 .. 260 >> Следующая

Далеко не все объекты, выполняющиеся под управлением Component Services, могут работать с распределенными транзакциями, Так, бизнес-компоненты приложения зачастую передают под управление Component Services для оптимального использования пула соединений.
Атрибут TransactionOption вашего класса определяет, будет ли класс учасгно-вать в В следующем фрагменте кода экземпляры класса всегда выпол-
няются в транзакции. Если экземпляр создан в контексте транзакции, он будет в ней участвовать. В противном случае для экземпляра создается собственная транзакция.
Visual Basic
<Transaction{TransactionOptlon.Required)>
Public Class clsDistributedTransaction InheritsServicedComponent
ГЛАВА Сложные случаи обновления данных
449
Visual C# .NET
[Transaction(TransactionOption.Required)] public class TxDenoSvr : ServicedComponent
<
Атрибуту 'iiansiia/o/if.'l'iiui можно задать любое значение из одноименного перечисления (табл. 11 -2),
Таблица 11-2. Элементы перечисления TransactionOpiion Константа Значение Описание
Disabled 0 Значение по умолчанию. Компонент не участвует в тран-
закции
NotSupported 1 Компонент выполняется вне контекста транзакции, та
существует
Supported 2 Компонент участвует в транзакции, если та существует, но
наличия транзакции не требует
Ri-qniivd 3 Компонент участвует в транзакции, если та существует.
Если же транзакции не существует, для компонента создается собственная транзакция
Reauin-^Sva 4 Компонент всегда создается в новой транзакции
Регистрация ADO.NET-соединения в транзакции
Одно из преимуществ модели Component Services — то, что специально писать код, регистрирующий ADO.NET-соединение в транзакции Component Services, не требуется. Вам даже не надо использовать ADO.NET-транзакции. Выполнение всей работы возлагается на службу Component Services. Если ваш код выполняется в контексте транзакции. Component Services автоматически зарегистрирует ваше соединение в данной транзакции.
Подтверждение или отмена результатов работы
Все, что осталось сделать, — добавить в компонент логику, определяющую, следует ли подтвердить или отменить результаты выполненной вами работы. Если вы обнаружите, что запросы не возвращают требуемых результатов или код перехватывает неожиданное исключение и не способен обработать его, можно выполнить одну строку кода и откатить всю работу, проделанную в контексте данной транзакции по разным соединениям. Вам следует лишь вызвать метод объекта ContextUtil, доступного вашему классу. Для подтверждения результатов работы применяется метод
Visual Basic .NET
Public Sub MyTransactionalMethodO Try
'Connect. 'Run queries, 'Disconnect.
If blnSuccess Then
450
Часть ill Автономная работа с данными: объект DataSet модели ADO NET
ContextUt.il. SetComplete( )
Else
ContextUtil.SetAbortO End If
Catch ex As Exception
ContextUtil.SetAbortO
Throw New Exception{ "Unexpected exception: " & ex. Message) End Try End Sub
Visual C# .NET
public void MyTransactionalMethodO try
//Connect.
queries. //Disconnect, if (blnSuccess)
ContextUtil. SetCotnplete( );
else
ContextUtil. SetAbortO;
>
catch (Exception ex) {.SetAbortO;
throw
ContextUtil new Exception"Unexpected exception: " + ex. Message);
}
;
Примечание Объект ContextUtil содержит сведения о контексте Подроб-
нее о возможностях данного объекта — в документации \1М>\
Помните: вызов меииа в конце процедуры не обязательно озна-
чает, что служба Component Services подтвердит выполненную в контексте транзакции работу. Такой вызов — лишь первый этап процесса двухфазной фиксации. Если хотя бы один из участвующих в транзакции компонентов вызовет метод SeL'ibnr; координатор укажет диспетчерам ресурсов всех компонентов (пялить результаты работы, выполненной в контексте транзакции.
Здесь можно провести аналогию с церемонией бракосочетания — она носит характер, пока вы не скажете: Если ваш партнер в
последний момент откажется, свадьба не состоится.
Упрощенная работа с распределенными транзакциями
Разработчики, создававшие компоненты на основе предыдущих версий технологии Component Services (например, Microsoft Transaction Server), помнят методы SetComplete и SetAbort. Кроме того, есть новый способ сообщить координатора транзакций о необходимости подтвердить сделанные в ходе транзакции изменения.
ГЛАВА Сложные случаи обновления данных
451
определить, нужно ли подтвердить или откатить результаты работы, выполненной в ходе транзакции, очень просто: если не возникло неожиданной ошиб-
шменения • . ... Чтобы упростить данный процесс, задайте процедуре атрибут AuloComplete. Когда задан АтрибутAutoComplete метода, Component Services предполагает, что если метод не сгенерирует необработанное исключе-пп'-1. транзакцию следует подтвердить.
Мммимтс: если в коде используется атрибут AutoComplete и вы перехватили исключение, для сообщения о необходимости откатить транзакцию нужно сге-новое или повторно сгенерировать старое исключение.
Задать -АтрибутAutoComplete методов класса можно способом, показанным ниже:
Предыдущая << 1 .. 189 190 191 192 193 194 < 195 > 196 197 198 199 200 201 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100