2013-05-24 4 views
5

Представьте выполнение запроса, используя код, подобный этому здесь:После запроса 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 Isolation.

Если мой обычный запрос был:

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-whole-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 в конце моего запроса? Или мой прочитанный uncommitted только хорошо для этого одного запроса? Или, может быть, жизнь связи (которая рассматривает мой код будет означать, как только я верну DataSet, так как мое соединение закрывается тогда)?

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

ответ

5

Ответ здесь может быть полезным: уровень изоляции WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

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

+0

Большое спасибо за отзыв - зеленая галочка и надпись! – JustLooking