想象一下使用与此处类似的代码执行查询:
using (SqlConnection TheConnection = GetSqlConnectionNoCatch(SQLConnectionStr))
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(SQLStatement, TheConnection) { MissingSchemaAction = SchemaAction })
{
DataSet TheDataSet = new DataSet();
TheDataAdapter.SelectCommand.CommandTimeout = SQLTimeout;
TheDataAdapter.Fill(TheDataSet, TableName);
return TheDataSet;
}
想象一下,必须读取一个绝对会不停地写入的数据库表,这会导致很多死锁和故障,因此您必须使用未提交的读取隔离级别执行该读取。
如果我的正常查询是:
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause
我经常看到您将其更改为:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause
好的,这就是我问这个问题的原因,这个特定的链接:http: //blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-整个交易/
他的例子如下:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT *
FROM AdventureWorks.Sales.SalesOrderDetail sod
INNER JOIN AdventureWorks.Sales.SalesOrderHeader soh ON
sod.SalesOrderID = soh.SalesOrderID
ORDER BY sod.ModifiedDate
-- Set isolation level to original isolation level
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
我是否也需要在查询结束时将其设置回 READ COMMITTED ?还是我未提交的读取只对那个查询有用?或者可能是连接的生命周期(检查我的代码意味着只要我返回数据集,因为我的连接随即关闭)?
网络上的大多数示例都省略了“将其设置回原始隔离级别”,因此他将其包含在内令我感到困惑。谢谢!