如何解决MSDN的问题:在读者打开之前关联BeginTransaction

时间:2013-07-19 16:44:50

标签: sql sql-server

我注意到此处BeginTransaction文档中的注意事项:

http://msdn.microsoft.com/en-us/library/86773566.aspx

  

当您的查询返回大量数据和调用时   BeginTransaction,抛出SqlException,因为SQL Server没有   使用MARS时允许并行事务。为了避免这个问题,   始终将事务与命令,连接或关联   在任何读者都开放之前。

这个建议是我改变了这个:

sqlConn.Open();

System.Data.SqlClient.SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
sqlCmd.Transaction = trans;

System.Data.SqlClient.SqlDataAdapter adapt = new System.Data.SqlClient.SqlDataAdapter(sqlCmd);
adapt.Fill(dt);

对于这个,这不是我通常在示例中看到的,BeginTransaction命令在Open命令之前......

System.Data.SqlClient.SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
sqlCmd.Transaction = trans;

sqlConn.Open();

System.Data.SqlClient.SqlDataAdapter adapt = new System.Data.SqlClient.SqlDataAdapter(sqlCmd);
adapt.Fill(dt);

否则,任何人都可以举出一个例子来说明这种谨慎措施要避免吗?

1 个答案:

答案 0 :(得分:1)

后一个代码将不会执行,因为在打开连接之前无法启动事务。第一个例子是正确的。 MSDN在这里说的是,一旦你开始执行一个命令(并没有读完结果),你就无法打开一个事务。您必须在第一个命令之前(或命令之间)打开事务。

我认为最好始终在显式事务下运行,因为ADO.NET连接池中存在一个错误/特性,它会泄漏池化连接的隔离级别。