asp.net - 我想在我的 SQL 连接字符串中加入 Enlist=False 吗?
问题描述
我们有一个使用 ASP.NET 和 SQL Server 2008 构建的大型网站,并且有一些连接问题可能(根据其他 StackOverflow 问题和其他地方)可以通过添加Enlist=False
到连接字符串来解决,以覆盖True
.
我阅读了有关分布式事务的信息,但我认为我们不会使用它们,但我仍然不确定在我们的实时服务器上进行此更改。也许这没有什么区别!我的基本问题是:
Enlist=False
当我们不使用 ASP.NET 代码中的任何事务时,是否要添加到我的连接字符串?
有人谈论在不久的将来将事务添加到我们的一两个 SQL 存储过程中 - 简单BEGIN TRAN
而COMMIT TRAN
类似的东西 - 但在 ASP.NET 中我们肯定不会有事务。(我们也不使用 DAAB。)
解决方案
我想我理解你的问题,并想分享一些经验。
第1部分
我正在分发一个 ASP.NET 应用程序,我基本上不需要自己的事务。该应用程序运行在私人笔记本电脑以及企业框架内,在具有分布式服务的虚拟服务器上。
大约两年前,我遇到了一种情况,我设置Enlist=False
了web.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 进行构建。
推荐阅读
- ssis - SSIS - 如何使用执行 SQL 任务的结果来调用 Web 服务
- python - 当我在盒子上按 onclick() 时出现硒问题
- snowflake-cloud-data-platform - 如何应对大数据文件格式和外部表中区分大小写的列名?
- javascript - 通过检查 Span 文本将 CSS 类添加到 Div
- c# - 如何在类库中获取字符串资源
- laravel - 类中的 Laravel 责任
- google-bigquery - 通过 Power BI 的 Google BigQuery Rest API 问题
- python - Python 处理字节相关对象的内存使用情况
- swagger - 下载 Excel 文件作为 Open Api 3 的响应
- c# - 用于 Keras 的 IDataView 为 ImageClassification 转换的 ONNX 模型