Представьте себе выполнение запроса с использованием кода, подобного приведенному здесь:
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;
}
И представьте, что вам нужно читать таблицу базы данных, которая постоянно и непрерывно подвергается записи, что приводит к множеству взаимоблокировок и сбоев, поэтому вы должны выполнять это чтение, используя уровень изоляции Read Uncommitted.
Если бы мой обычный запрос был:
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-for-all-transaction/
Его пример имеет следующее:
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 в конце моего запроса? Или мое незафиксированное чтение подходит только для этого одного запроса? Или, может быть, срок службы соединения (что означало бы, что проверка моего кода будет означать, что, как только я верну DataSet, мое соединение закроется прямо тогда)?
В большинстве примеров в сети не упоминается «вернуть исходный уровень изоляции», поэтому меня озадачило то, что он его включил. Спасибо!