(我知道围绕 DTC 和促进交易的情况对于我们这些不知情的人来说可能有点神秘,但让我向您展示我的公司是如何做事的,如果您能告诉我为什么 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 设置中启用“允许远程客户端”——让 IT 允许这将是一场斗争。
我很想避免 DTC 卷入其中,但我可以这样做吗?我可以省略 methods1-3() 中的事务调用,让 TransactionScope 弄清楚吗?