0

我有以下情况:

  • 应用程序使用 2 个数据库
  • 在某些时候,我需要使用事务范围:

    插入记录表 A 数据库 X

    插入记录表 C 数据库 Y

    提交更改

    插入记录表 B 数据库 X (B 的字段之一具有 A 的主键 id 的值,这就是我需要调用 submitchanges 的原因)

    提交更改

    A & B 必须同时成功,或一起失败。C没关系。在 C 上插入确实会触发错误 MSDTC is nog available。但我不希望 C 成为交易的一部分(无论出于何种原因)我知道通常当它们是 A 和 B 之间的关系时,值(FKid)会自动填充,但我不能使用 FK 关系在这种情况下。(我想如果不使用 FK 就无法将 a 的 id 放入 b 中?)

    我试图仅在 Y 的连接字符串上指定 enlist=false ,甚至在 X 和 Y 上都指定,但我仍然得到错误。

4

2 回答 2

0

MSDTC 是分布式事务协调器。当您尝试在一个事务中更新多个数据库时,该事务将升级到 MSDTC。我相信,必须在数据库服务器和客户端上启用 MSDTC。如果您想避免这种升级,您需要有两个单独的事务(使用两个单独的连接),一个用于数据库 X,一个用于数据库 Y。

于 2013-08-08T11:57:20.747 回答
0

在我看来,当一个事务从本地事务提升为分布式事务时,并不总是很容易知道,而且我经历过一些地方,我希望它是本地事务,它已被提升为分布式事务,需要故障诊断码。

但是,在不同的事务中显式运行插入数据库 Y 可以解决该问题。TransactionScope.Suppress然后,您可以使用or显式指定事务TransactionScope.RequiresNew

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx

// Update table A in database X
// ...


using(TransactionScope scope = new TransactionScope(
          TransactionScopeOption.RequiresNew
    ))
{
   // Update table C in database Y
   ...
   scope.Complete();
}

// Update table B in database X

但是,问问自己,在数据库 Y 上的表 C 中的插入是否完全独立于在数据库 X 中的表 A 中的第一次插入?如果不是,如果插入数据库 X 的表 B 失败,那么插入数据库 Y 的表 C 是否仍然有效?或者您最终可能会得到不一致的数据?而且,如果是这样,您将 DTC 带入汤中是否足够重要?

于 2013-08-09T05:58:36.573 回答