Я не пользователь 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 автоматически зарегистрирует их в истинной распределенной транзакции .