#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?