Должен ли я после запроса Read Uncommitted снова установить для него значение Committed?

Представьте себе выполнение запроса с использованием кода, подобного приведенному здесь:

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, мое соединение закроется прямо тогда)?

В большинстве примеров в сети не упоминается «вернуть исходный уровень изоляции», поэтому меня озадачило то, что он его включил. Спасибо!


person JustLooking    schedule 24.05.2013    source источник


Ответы (1)


Ответ здесь может быть полезным: WITH (NOLOCK) vs SET TRANSACTION УРОВЕНЬ ИЗОЛЯЦИИ ЧИТАТЬ НЕОБХОДИМО

Уровень изоляции транзакции - это настройка уровня подключения. Это означает, что любые вызовы вложенных хранимых процедур и т. Д. Будут использовать ваш новый параметр уровня изоляции, но другие пользователи / окна запросов / сеанс от того же пользователя будут использовать применимое значение по умолчанию (или то, что было установлено последним).

В вашем случае вам не требуется возвращать уровень изоляции к зафиксированному, если у вас нет других операторов или наборов данных для возврата, которые не должны использоваться позже в том же сеансе без фиксации. Сброс - это просто хорошая практика.

person guitarultimate    schedule 24.05.2013
comment
Большое спасибо за ответ - зеленая галочка и положительный голос! - person JustLooking; 29.05.2013