(Я знаю, что обстоятельства, связанные с DTC, и продвижение транзакции могут быть немного загадочными для тех из нас, кто не знает, но позвольте мне показать вам, как моя компания делает что-то, и если вы можете сказать мне, почему DTC вовлекаясь, и, если возможно, что я могу сделать, чтобы этого избежать, я был бы благодарен.)Вопрос TransactionScope - как я могу заставить DTC участвовать в этом?
У меня есть код, запущенный на веб-сервере ASP.Net. У нас есть одна база данных, SQL 2008.
Наш код доступа к данным выглядит примерно так: у нас есть уровень доступа к данным, который использует объект-оболочку для SQLConnections и SQLCommands. Типичное использование выглядит следующим образом:
void method1()
{
objDataObject = new DataAccessLayer();
objDataObject.Connection = SomeConnectionMethod();
SqlCommand objCommand = DataAccessUtils.CreateCommand(SomeStoredProc);
//create some SqlParameters, add them to the objCommand, etc....
objDataObject.BeginTransaction(IsolationLevel.ReadCommitted);
objDataObject.ExecuteNonQuery(objCommand);
objDataObject.CommitTransaction();
objDataObject.CloseConnection();
}
Так действительно, очень тонкую оболочку вокруг SqlClient, SqlConnection и т.д. Я хочу запускать несколько хранимых проки в транзакции, а класс-оболочка не позволяет мне доступ к SqlTransaction, поэтому я не могу передать его с одного компонента на другой. Это привело меня использовать TransactionScope:
using (TransactionScope tx1 = new TransactionScope(TransactionScope.RequiresNew))
{
method1();
method2();
method3();
tx1.Complete();
}
Когда я делаю это, DTC ввязывается, и, к сожалению, наши веб-серверы не имеют «позволяют удаленным клиентам» включен в MSDTC settings-- получение ИТ допустить, что будет борьба.
Я хотел бы избежать использования DTC, но могу ли я это сделать? Могу ли я игнорировать транзакционные вызовы в методах1-3() и просто позволить TransactionScope все выяснить?
Спасибо. Я беспокоился об этом. SomeConnectionMethod() - это метод утилиты, который создает новое соединение каждый раз, когда он вызывается. Я не могу это изменить, и, к сожалению, класс objDataObject наследуется от не имеет своего объекта Connection public или get-able как свойство, поэтому я не могу поделиться им с другими объектами objDataObjects. Похоже, мне не повезло в этом подходе. – larryq