1

(我知道围绕 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 弄清楚吗?

4

2 回答 2

1

做什么SomeConnectionMethod()?如果它在和中没有返回相同的连接method1(),那么您就有了分布式事务。因此 DTC 将参与协调此交易。method2()method3()

因此,您必须返回相同的连接SomeConnectionMethod()以防止 DTC 参与您的事务。

于 2009-12-12T07:15:16.990 回答
0

为什么它不起作用:

我认为即使您共享相同的连接(如 larryq 所建议的那样),如果不涉及 DTC,它也将无法工作。

您想要一个 Transaction 范围来包装这些方法:

  • 方法1
    • 开始转
    • 提交事务
  • 方法2
    • 开始转
    • 提交事务
  • 方法3
    • 开始转
    • 提交事务

在您开始并提交的每种方法中。如果方法 3 出现问题,您希望回滚所有内容,包括方法 1 和 2 中已经提交的事务。为此,您需要一个涵盖所有 3 种方法的 DTC 事务

如果我错了,请纠正我,但我认为只有在方法内不开始和提交事务时,才能使用 TransactionScope 并避免使用 DTC。

它是如何工作的:

你真的需要在开始和提交中使用事务吗?你不能做这样的事情:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) {
   objDataObject.ExecuteNonQuery(objCommand);
}

如果已经存在,则Scope Required而不是RequiredNew使用现有事务。

如果我有什么问题,请随时纠正我。

于 2010-03-20T14:12:54.177 回答