2012-02-21 32 views
0

我在TransactionScope中执行多个存储过程。有没有办法执行SqlCommand(虽然仍在使用语句的范围内),但将其从事务中移除?TransactionScope中的非事务性执行

在它之前和之后执行的SqlCommands需要在一个事务中执行。

回答

1

您可以设置为“假”的“Enlist”连接参数创建一个新的SqlConnection实例

SqlConnectionStringBuilder csBuilder = new SqlConnectionStringBuilder(existingCon.ConnectionString); 
csBuilder.Enlist = false; 
SqlConnection newConnection = new SqlConnection(csBuilder.ConnectionString);  
SqlCommand commandNotInTheTx = newConnection.CreateCommand(); 
+0

另外,如果您知道给定的连接应始终避免环境事务,则可以将“Enlist = false”放入配置中的连接字符串中,并避免任何额外的编码或连接管理。此链接适用于.NET 1.1,但征集部分仍然准确,我相信:http://msdn.microsoft.com/en-us/library/aa720033(v=vs.71).aspx – 2012-05-03 17:16:56

2

你必须打开另一个连接并在那里执行你的语句。但要小心:该声明不会看到未提交事务的任何更改。

+0

声明是已经有一个单独的连接,但由于它是用的TransactionScope的using语句。 NET试图把它放在同一个事务中。任何想法如何创建一个不使用事务的连接? – DJCasey 2012-02-21 05:56:18

0

IIRC,事务登记要求连接成为同一连接池的成员。如果对第二个连接使用稍微不同的连接字符串(可能使用不同的Application Name),则可能会使其绕过征募。

只要小心,不要不小心开始使用分布式事务和DTC。

1

您需要创建一个新的作用域并指定Supress选项。

相关问题