Импорт пользователей DotNetNuke с использованием транзакций с классами DNN - PullRequest
0 голосов
/ 27 августа 2009

Я разрабатываю модуль в DNN 4.9 для импорта пользователей.

Мне нужна поддержка транзакций, но я должен использовать классы DNN для импорта / создания пользователей. Из коробки классы не поддерживают транзакции.

Я использую следующий объект для создания пользователей:

UserController.CreateUser(ref UserInfo) ...

Поскольку я улучшаю существующий модуль и полностью переписываю / изменяю способ импорта, это не вариант. (например, использование операторов SQL напрямую для создания пользователей)

1 Ответ

0 голосов
/ 05 сентября 2009

Я не пользователь DNN, но в контексте транзакции CLR любая операция ADO.Net автоматически регистрируется в транзакции:

 using(TransactionScope scope = new TransactionScope(
     TransactionScopeOption.Required))
 {
      UserController.CreateUser(ref UserInfo) 
      ...
      scope.Complete();
 }

Если какой-либо код DNN явно не отключит область транзакции (создав новую область с параметром Supress), тогда фактическая работа базы данных будет зарегистрирована в соответствующей транзакции (например, любая операция SqlClient быть зачисленным в SqlTransaction).

Обновление

Область транзакции - это объект контекста, связанный с текущим потоком. После создания .Net-компоненты, которые проверяют его существование, найдут его и узнают, что они должны участвовать в транзакции.

Файловая операция не может зарегистрироваться в области транзакций, поскольку базовая файловая система не поддерживает транзакции (по крайней мере, до Win7). Компоненты, такие как поставщик SQL Server, поставщик Oracle, средство доступа MSMQ и другие компоненты .Net, поддерживающие транзакции, начнут транзакцию и добавят ее в текущую область. Когда область действия «завершена», эквивалентная SqlTransaction фиксируется. Если область действия «заканчивается» (т. Е. Ее метод Dispose вызывается из-за того, что она достигает конца блока using), но не «завершается», операция SqlTransaction откатывается.

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

...