У меня есть хранимая процедура T-SQL, работающая на сервере базы данных Sybase ASE, которая иногда не выполняет все свои операции, даже если она завершена без исключения. Вот пример того, что он делает.транзакция базы данных только частично совершает
BEGIN TRANSACTION
UPDATE TABLE1
SET FIELD1 = @NEW_VALUE1
WHERE KEY1 = @KEY_VALUE1
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 1
END
UPDATE TABLE2
SET FIELD2 = @NEW_VALUE2
WHERE KEY2 = @KEY_VALUE2
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 2
END
INSERT TABLE2 (FIELD2, FIELD3)
VALUES (@NEW_VALUE3a, @NEW_VALUE3b)
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 3
END
COMMIT TRANSACTION
RETURN 0
Процедура называется по меньшей мере сотни раз в день. В небольшом проценте случаев (вероятно, < 3%), завершается только заявление INSERT
. Процесс завершает и возвращает 0, но два UPDATE
s не принимают. Изначально мы думали, что статьи WHERE
на UPDATE
s не соответствуют друг другу, поэтому мы добавили логику IF @@rowcount
. Но даже с теми проверками там INSERT
все еще происходит, и процедура по-прежнему завершается и возвращается 0.
Я ищу идеи о том, что может вызвать эту проблему. Есть ли что-нибудь о том, как работают транзакции SQL или как работает Sybase, что может привести к тому, что COMMIT
не будет выполнять все? Есть ли что-то в моих блоках IF
, которые могут позволить UPDATE не соответствовать чему-либо, кроме процедуры продолжить? Любые другие идеи?
У вас есть _IF @Error <> 0_ два раза, что должно быть _IF @@ ERROR <> 0_, но это скорее всего тип 0 в вашем примере кода –
@KM, спасибо, я исправил пример , Фактический код имеет @@ s. –