我注意到此处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);
否则,任何人都可以举出一个例子来说明这种谨慎措施要避免吗?
答案 0 :(得分:1)
后一个代码将不会执行,因为在打开连接之前无法启动事务。第一个例子是正确的。 MSDN在这里说的是,一旦你开始执行一个命令(并没有读完结果),你就无法打开一个事务。您必须在第一个命令之前(或命令之间)打开事务。
我认为最好始终在显式事务下运行,因为ADO.NET连接池中存在一个错误/特性,它会泄漏池化连接的隔离级别。