Выполнение SP вне очереди в транзакции - PullRequest
0 голосов
/ 03 июня 2011

Используется SQL Server 2005.

Каждый раз, когда поступают новые данные, они сохраняются и после них вызывается SP, который использует эти данные для вычисления некоторых статистических данных.Хранение данных и вызов SP выполняется за одну транзакцию.SP зачисляется в транзакцию, как

using (var transaction = session.BeginTransaction())
{
    // ... executing insert/update statements ...

    var command = new SqlCommand("StoredProcedureName", connection);

    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@name", value));

    transaction.Enlist(command);
    command.ExecuteNonQuery();

    transaction.Commit();
}

При запуске SQL Profiler я вижу, что все операторы вставки / обновления отображаются там только после вызова метода transaction.Commit();, но вызов SP отображается сразу после вызова command.ExecuteNonQuery(); метод.В результате вызов SP отображается перед инструкциями вставки / обновления в SQL Profiler.Это заставляет меня думать, что SP фактически выполняется перед любыми инструкциями вставки / обновления, что логически неверно.

Вопрос в том, почему вызов SP отображается в SQL Profiler после вызова метода command.ExecuteNonQuery();, а не transaction.Commit();один?Означает ли это, что он выполняется сразу, а не после выполнения операторов вставки / обновления?

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

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

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

1 голос
/ 03 июня 2011

SQL Profiler показывает операторы по мере их выполнения. Операторы, выполняемые с ExecuteReader и ExecuteNonReader, являются синхронными, поэтому операторы вставки / обновления будут отображаться перед процедурой в SQL Profiler.

Итак, вы ищете объяснение, как вы делаете операторы вставки / обновления? Возможно ли, что у вас есть слой базы данных, который ждет до commit, прежде чем он начнет отправлять SQL на сервер?

...