首页 > 解决方案 > 我想在我的 SQL 连接字符串中加入 Enlist=False 吗?

问题描述

我们有一个使用 ASP.NET 和 SQL Server 2008 构建的大型网站,并且有一些连接问题可能(根据其他 StackOverflow 问题和其他地方)可以通过添加Enlist=False到连接字符串来解决,以覆盖True.

我阅读了有关分布式事务的信息,但我认为我们不会使用它们,但我仍然不确定在我们的实时服务器上进行此更改。也许这没有什么区别!我的基本问题是:

Enlist=False当我们不使用 ASP.NET 代码中的任何事务时,是否要添加到我的连接字符串?

有人谈论在不久的将来将事务添加到我们的一两个 SQL 存储过程中 - 简单BEGIN TRANCOMMIT TRAN类似的东西 - 但在 ASP.NET 中我们肯定不会有事务。(我们也不使用 DAAB。)

标签: asp.netsql-servertransactions

解决方案


我想我理解你的问题,并想分享一些经验。

第1部分

我正在分发一个 ASP.NET 应用程序,我基本上不需要自己的事务。该应用程序运行在私人笔记本电脑以及企业框架内,在具有分布式服务的虚拟服务器上。

大约两年前,我遇到了一种情况,我设置Enlist=Falseweb.config以避免异常。

这一直很好用——所以我回答的第一部分是,如果你不需要事务、分布式事务或其他,如果你添加Enlist=False.

第2部分

同时,我添加了很多导入功能。在导入时,可能会创建数百条新的数据库记录。在这里,如果出现问题,回滚所有内容对我来说至关重要。由于我无法创建复杂的 SQL 回滚(即在导入时创建单个 SQL 回滚命令),我不得不使用事务。

由于导入相当复杂,我最终得到了混合代码:

  • 一些代码正在使用 DbContext: MyEntities.Add(xx), ... ,dbContext.SaveChanges()
  • 有些代码有 SQL,使用SqlCommand.

因此,我不得不在一些交易框架内结合这些行动——结果证明这TransactionScope是正确而美妙的事情。但是,我花了一些时间才明白TransactionScope只有在Enlist=False 未设置时才有效。嵌套的操作根本不会在其他情况下加入事务框架,并且Complete()为了回滚而回避没有任何影响。

现在我继续使用Enlist=False它作为我的应用程序标准,但是对于导入,我DbContext使用修改后的连接字符串创建一个临时的。你明白了:

...
connectionString = Regex.Replace(originalString, @"\s*;\s*Enlist\s*=\s*False\s*", "", RegexOptions.IgnoreCase);
...

这融合在一起,因为我提供了在数据库之间进行选择的可能性,并且无论如何我都必须动态获取连接字符串。这很好用,我可以完全控制发生在哪里。

因此,我回答的第二部分是Enlist=False,如果您以后遇到问题,您可以偶尔删除。

我正在使用目标 ASP.NET 框架版本 4.5 进行构建。


推荐阅读