T-SQL insert into иногда не удается добавить в таблицу случайным образом

#c# #sql-server #tsql #sqltransaction

#c# #sql-сервер #tsql #sqltransaction

Вопрос:

Итак, у меня есть две таблицы: Records (входной идентификатор = первичный ключ) и Tasknote (входной идентификатор, TaskNote : нет первичного ключа).

Раньше существовала одна хранимая процедура, которая добавлялась в таблицу записей, получала первичный идентификатор, который был сгенерирован, а затем добавляла этот идентификатор в таблицу TaskNotes вместе с текстом task notes.

Недавно возникла проблема, из-за которой sproc выполнялся, казалось бы, наполовину, при добавлении записи, но запись task notes не выполнялась.

С тех пор я разделился на хранимую процедуру addRecord и хранимую процедуру AddTaskNotes, которые вызываются из приложения C #.

Это работает так же, как и раньше, однако в случайном порядке AddTaskNotes по-прежнему не будут выполняться.

Я думаю, что проблема заключается в блокировке таблицы TaskNotes.

Кто-нибудь сталкивался с этим раньше и мог сообщить мне, как это было решено?

Текущая скорость составляет около 1 сбоя tasknotes на каждые 400 записей записи.

Это оператор addRecord;

  INSERT  INTO Time.Records
                        ( TeamID ,
                          UserID ,
                          TimeIN ,
                          TimeOUT 
                        )
                VALUES  ( @TeamID ,  @UserID ,  @TimeIN , @TimeOUT );
                

                return SCOPE_IDENTITY();
  

Это оператор AddTaskNotes;

 BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    INSERT INTO Time.TaskNotes ( InputID, TaskNotes )
    VALUES  ( @InputID,  @TaskNotes   );
END
  

Комментарии:

1. «С тех пор я разделился на хранимую процедуру addRecord и хранимую процедуру AddTaskNotes, которые вызываются из приложения C #». Почему? Если эти две вставки должны быть атомарной операцией, проще и безопаснее создавать транзакции и управлять ими в одной хранимой процедуре, чем в нескольких хранимых процедурах…

2. Маловероятно, что он не выполняется (за исключением исключения, которое незаметно скрывается), но как вы проверили правильность @InputID ? Что AddRecord делает и как он «получает первичный идентификатор, который был сгенерирован», учитывая, что существует множество неправильных способов как генерации, так и извлечения таких значений?

3. Если ваш журнал приложений C # «ничего не показывает», то, похоже, это может быть немного неполный журнал ?! По крайней мере, можно было бы надеяться, что какое-то ведение журнала где-нибудь подтвердит, что sproc выполняется.. на данный момент кажется, что вы говорите, что просите SQLS что-то сделать, и он просто этого не делает, без указания причины или ошибки. Как выглядит C #?

4. Есть две причины, по которым строки нет в таблице: либо она никогда не вставлялась в первую очередь, либо она была удалена после вставки. Вы можете охватить первый случай, дважды проверив правильность параметров и отсутствие ошибок, которые не регистрируются (добавьте внутренний обработчик исключений, если необходимо, для дополнительного подтверждения). Охват второго случая был бы сложнее без трассировки профилировщика. Ни при каких обстоятельствах, кроме серьезной ошибки в движке, T-SQL INSERT просто не сможет вставить что-либо без генерации ошибки; вы можете почти наверняка исключить такую возможность.

5. если это идентификатор (1,1), почему вы ссылаетесь на него в инструкции INSERT?