Запустите инструкцию SET в Dapper SqlBuilder или sp_exectuesql - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь установить уровень изоляции транзакции в Dapper с помощью SqlBuilder, но, похоже, не работает.

var builder = new SqlBuilder();
var sqlStatement = builder.AddTemplate(@"
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT * FROM Users
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
conn.Query<User>(sqlStatement.RawSql);

Но это работает:

conn.Execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var result = conn.Query<User>(sqlStatement);
conn.Execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");

Я подумал, что это возможно, потому что с SqlBuilder Dapper создает динамический SQL и выполняет с sp_executesql хранимой процедурой.

Чтобы подтвердить свою гипотезу, я попробовал следующие операторы SQL:

exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'

После этого заявления я запросил sys.dm_exec_sessions, чтобы проверить мое соединение, и он все еще показывает ReadCommitted, который является уровнем изоляции по умолчанию в моей базе данных.

Есть ли способ обойти установку уровня транзакции (или любого другого оператора SET) в отдельном .Execute? Или, может быть, специальный способ использовать оператор SET в sp_executesql?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

После очередного тестирования приведенный здесь пример, похоже, работает.Я думаю, что это должно сделать наш производственный SQL-запрос.

Мы нашли несколько других способов выполнить это.

Указание уровня изоляции в транзакции:

using (var trans = conn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
{
    conn.Query<User>(sqlStatement.RawSql, transaction: trans).Dump();
}

Добавить изоляциюуровень в шаблоне строителя:

var readUncommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var readCommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
0 голосов
/ 09 мая 2018

Попробуйте это:

SELECT * FROM Users with (nolock)

Это то же самое, что и использование SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED перед выполнением оператора выбора.

Подробнее о: С (NOLOCK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...