Транзакция базы данных фиксируется только частично
-
22-09-2019 - |
Вопрос
У меня есть хранимая процедура 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
блоки, которые могли бы позволить ОБНОВЛЕНИЮ не соответствовать ничему, кроме продолжения процедуры?Есть еще какие-нибудь идеи?
Решение
возможно ли, что они обновляются, но что-то меняет значения обратно?попробуйте добавить триггер обновления к этим таблицам и внутри этого триггера вставить в таблицу журнала.для строк, которые, по-видимому, не были обновлены, посмотрите в журнале, есть ли строка или нет?
Другие советы
Не зная, как вы устанавливаете значения для своих переменных, мне приходит в голову, что если значение @NEW_VALUE1 совпадает с предыдущим значением в FIELD1 , обновление будет успешным, и все же, похоже, ничего не изменило, заставляя вас думать, что транзакция не произошла.
У вас также может быть триггер, который влияет на обновление.