Выполнение последовательных хранимых процедур; работает в анализаторе запросов, не в моем приложении .NET - PullRequest
0 голосов
/ 30 марта 2010

У меня есть таблица записей аудита, в которую я пишу. Я подключаюсь к MyDb, в которой есть хранимая процедура с именем «CreateAudit», которая является сквозной хранимой процедурой, к другой базе данных на той же машине, называемой MyOther DB, с хранимой процедурой под названием «CreatedAudit».

Другими словами, в MyDB у меня есть CreateAudit, который выполняет следующее EXEC dbo.MyOtherDB.CreateAudit.

Я вызываю хранимую процедуру MyDb CreateAudit из моего приложения, используя в качестве DAL дозвуковую. В первый раз, когда я это называю, я называю это следующим (псевдокод):

            int openStatus, closeStatus = 0;
            openStatus = Convert.ToInt32(SPs.LogAccess(userId, "OPENED"));
            closeStatus = Convert.ToInt32(SPs.LogAccess(userId, "CLOSED"));

Это упрощено, но вот что называет LogAccess:

 ALTER procedure [dbo].[LogAccess]
      @UserID           uniqueid,
      @Action           varchar(10),          
      @Status           integer output

 as

 DECLARE @mStatus INT

 EXEC [MyOtherDb].[dbo].[LogAccess]
      @UserID = @UserID,
      @Action = @Action,        
      @Status = @mStatus OUTPUT


 select @mStatus

Во второй хранимой процедуре предполагается пометить запись, созданную CreateAudit (recordId, "Opened"), статусом закрыто.

Это прекрасно работает, если я запускаю их независимо друг от друга или даже если я вставляю их в анализатор запросов. Однако при выполнении из приложения запись не помечается как «Закрытая».

Когда я запускаю профилировщик SQL, я вижу, что оба запроса выполнялись, и если я копирую запросы и запускаю их из анализатора запросов, запись помечается как закрытая 100% времени!

Когда я запускаю его из приложения, примерно один раз каждые 20 раз, запись успешно помечается как закрытая, остальные 19 раз ничего не происходит, но я не получаю сообщение об ошибке!

Можно ли приложению .NET пропустить вывод из первой хранимой процедуры и начать выполнение второй хранимой процедуры до создания записи в первой?

Когда я добавляю «WAITFOR DELAY '00: 00: 00: 003 '» в начало моей хранимой процедуры, запись также закрывается 100% времени.

У меня кружится голова, есть идеи, почему это происходит!

Спасибо за любые ответы, очень интересно услышать, как это может произойти.

1 Ответ

1 голос
/ 30 марта 2010

В вашем 1-м хранимом процессе попытайтесь заставить оператор EXEC ждать возвращаемого значения из 2-го хранимого процесса.Я подозреваю, что ваш первый SP запускает второй сохраненный процесс, а затем немедленно возвращает управление вашему .NET-коду, что приводит к проблеме параллелизма вышеупомянутого комментатора.(То есть, 2-й SP еще не завершил работу к тому времени, когда будет сделан ваш следующий вызов БД!)

SP1: EXEC @retval = SP2 ....
...