【发布时间】: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