【问题标题】:TansactionScope and MSDTC enlisting issuesTansactionScope 和 MSDTC 征募问题
【发布时间】:2014-03-13 11:04:44
【问题描述】:

我一直在研究我们面临的问题的解决方案。我正在使用 transacitonscope 将一些循环代码将保存数据包装到 SQL 2005。我们不得不恢复使用字符串并在 proc 中拆分,因此当字符串长度> 8000 时,我将其拆分,这在我们的测试中效果很好env 是 SQL 2008R2。问题是当我们将测试转移到 SQL 2005 环境时,事务会自动加入 msdtc。由于 2005 环境不同,例如不同的域和防火墙等我希望 SQL 服务器来处理事务而不是 msdtc。我们跟踪了SQL 2005 db,可以看到跟踪中的DTC事务,跟踪SQL2008时只使用跟踪中的SQL事务。

代码本身很简单 - using 语句(TransactionScope ...),在 using 块中有一个循环,它可能最多只能在 1 到 4 次迭代之间循环,并且在循环中有代码更新 sql 连接到同一个数据库,并且在此连接上创建了一个隐式 SQltransaction(用于解决单个更新)。我不能将相同的新连接传递回自身,因为代码位于数据访问层中,但是测试 SQL2008 与同一个数据库的新连接必须没问题(我相信它是新的)。每个循环都会对数据库进行实际的更新调用。如果是这样,如果字符串长度为 1200 字符,将有 2 次调用来更新数据库...

基于一些 SO 帖子,例如SqlConnection and avoiding promotion to MSDTC

有一个设置可以传递给连接字符串 Enlist=false,据我了解,这会将事务的管理保持在 sql server 上,并且只要您使用相同的数据库资源即可工作 - 在我的情况下相同sql 2005,在每个循环中都有新的连接,包括一个 connection.begintransaction - 任何人都可以确认这一点吗?还是在我的情况下使用连接设置 Enlist=false 危险?

更新: 要重新分阶段,在使用 Transcationscope、sql 2005 和看起来有点像这样的代码(伪代码)时,在连接字符串中使用 Enlist=false 是否有任何警告:

using (var ts = new transactionscope)    
{ 
    loop (twice) 
    {      
         using (var conn = new SqlConnection)
         using (var tran = conn.BeginTransaction)
         {
             //do update to the db code here; 
             tran.Commit();
         }
    }

    ts.Complete();
}

【问题讨论】:

  • 与其试图描述你的代码(你的叙述很密集,我不知道你的代码是什么样的),不如试着想出一个你可以包含的SSCCE在你的问题中。
  • 您说“我正在使用 transacitonscope 来包装一些循环代码”和“我希望 SQL Server 来处理事务而不是 msdtc”;这些说法相互矛盾。如果您想要 SQL Server 事务,请不要使用 TransactionScope。
  • 嗨@ShellShock,从我在sql 探查器中看到并读取transacitonscope 不会自动导致事务加入msdtc。使用 SQL 2005 时似乎确实如此,但使用 SQL 2008 时则不然
  • 嗨@Damien_The_Unbeliever,我尝试在帖子底部添加一些示例代码。
  • 嗨@Damien_The_Unbeliever,感谢自动格式化......

标签: c# sql sql-server sql-server-2008 msdtc


【解决方案1】:

如果您不登记连接(这是可能的),您的TransactionScope 将无效。你不想这样。

如果您登记多个SqlConnections,您将获得设计的分布式事务。基本上是这样。如果幸运的话,两者都将使用相同的内部池连接并避免使用 MSDTC(而是使用 SQL Server 轻量级分布式事务)。但是,这从不得到保证,并且会受到时间问题的影响。这是一个性能优化。我讨厌这种优化,因为在测试期间它总是会发生并且掩盖了潜在的问题。

不要打开多个连接。重复使用相同的连接。

【讨论】:

  • 这是我的直觉...... :(
  • 将重用同一个连接,Enlist=false 保证它不会使用 msdtc?
  • Enlist=false 它永远不会使用 MSDTC,也不会使用事务。没有意义。;正如我所说:重用相同的连接。我说了这一切。有什么不清楚的地方?
  • 为什么它不总是使用 SQL Server 轻量级分布式事务,因为您保证它使用相同的连接?还是 enlist=false 也会停止 SQL Server 轻量级分布式事务?我已经使用事务范围进行了测试,enlist=false - 它没有使用 msdtc,并且我在第二个循环中失败了 - 它确实按预期回滚。
  • 我昨晚发布了,但它不在此处 - 这个博客为我清除了它,当然对于 SQL2005 @usr 响应成立,SQL2008 有一些细微差别允许在不同的非登记事务连接,但有一个事务范围来回滚:(这里是博客:blogs.msdn.com/b/adonet/archive/2008/03/26/…,我将 usr 标记为正确,因为这是预期的行为,而且通常是正确的!它还在学习交易与促销......
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多