连接字符串中的Enlist=false是什么意思?它与SQL Server有关吗?

16

我是一个 .net 的初学者。我遇到了以下错误:

"由于有正在处理此事务的挂起请求,因此无法执行事务操作。"。

我在博客上看到过,将我的连接字符串附加上 enlist=true 后,问题得到了解决。

注意: 我正在将我的数据库从 SQL Server 2005 升级到 SQL Server 2008R2。

请帮助理解使用 enlist 的重要性。

2个回答

14

Enlisting是用于分布式事务的用户。

如果连接对象确定事务处于活动状态,则会自动在现有的分布式事务中注册。当连接被打开或从连接池中检索时,自动事务登记发生。您可以通过为SqlConnection指定Enlist=false作为连接字符串参数,或者为OleDbConnection指定Ole DB Services=-7作为连接字符串参数来禁用现有事务中的自动登记。

注意 在调用EnlistDistributedTransaction之前,必须使连接处于open状态。

以下是一个示例,其中Enlist=False;


5
MSDN上说:

ConnectionString属性支持一个关键字Enlist,它表示System.Data.SqlClient是否会检测事务上下文并自动将连接加入到分布式事务中。如果Enlist=true,则该连接会自动加入到打开线程的当前事务上下文中。如果Enlist=false,则SqlClient连接不会与分布式事务交互。Enlist的默认值为true。如果在连接字符串中未指定Enlist,则当连接打开时检测到分布式事务时,该连接会自动加入到分布式事务中。


这似乎是误导性的,因为Enlist=false意味着连接不会在任何环境事务中注册(例如来自TransactionScope),无论它是否分布式。因此,如果您根本不需要TransactionScopes,设置Enlist=false才能起作用,这似乎是非常不可取的事情。 - Patrick Szalapski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接