0

我注意到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);

否则,任何人都可以举例说明这种谨慎所说的要避免什么吗?

4

1 回答 1

1

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

我认为始终在显式事务下操作是最佳实践,因为 ADO.NET 连接池中有一个错误/功能会泄漏池连接之间的隔离级别。

于 2013-07-19T16:52:45.990 回答