Вопрос

У меня есть хранимая процедура 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, но два UPDATEs не берут.Первоначально мы думали, что, возможно, WHERE положения о UPDATEs ничему не соответствовали, поэтому мы добавили IF @@rowcount Логические.Но даже с учетом этих чеков там, в INSERT все еще происходит, и процедура все еще завершается и возвращает 0.

Я ищу идеи о том, что может вызвать такого рода проблемы.Есть ли что-нибудь в том, как работают транзакции SQL, или в том, как конкретно работает Sybase, что может быть причиной COMMIT не совершать всего?Есть ли что-то в моем IF блоки, которые могли бы позволить ОБНОВЛЕНИЮ не соответствовать ничему, кроме продолжения процедуры?Есть еще какие-нибудь идеи?

Это было полезно?

Решение

возможно ли, что они обновляются, но что-то меняет значения обратно?попробуйте добавить триггер обновления к этим таблицам и внутри этого триггера вставить в таблицу журнала.для строк, которые, по-видимому, не были обновлены, посмотрите в журнале, есть ли строка или нет?

Другие советы

Не зная, как вы устанавливаете значения для своих переменных, мне приходит в голову, что если значение @NEW_VALUE1 совпадает с предыдущим значением в FIELD1 , обновление будет успешным, и все же, похоже, ничего не изменило, заставляя вас думать, что транзакция не произошла.

У вас также может быть триггер, который влияет на обновление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top