MT_ Ответов: 1

Обновленное значение внутри транзакции


Привет SQL гуру,

В моей хранимой процедуре я использую транзакцию, а также вызываю другую хранимую процедуру. Какой-то псевдокод

begin transaction
    Update TableA set colA = 'Updated'
    exec SomeotherStoredProc
    if @@Error=0
        Commit Transaction
    else
        RollbackTransaction

В другой хранимой процедуре я проверяю, есть ли таблица.Кола имеет значение "обновлено" или нет. Но я не получаю значение "Обновлено".

Я знаю, пробовал и подтвердил, что если я нахожусь в той же хранимой процедуре, то получаю обновленное значение в TableA.ColA.

Правильно ли это поведение? Если да, то я хотел бы прочитать дальше. Пожалуйста, проводите.
Если нет, то что я упускаю?
Спасибо и с уважением,
Милинд

Что я уже пробовал:

Попробовал отладку и обнаружил, что обновленное значение недоступно в дочерней процедуре, но доступно в той же хранимой процедуре.

Wendelius

Что такое код для SomeotherStoredProc?

MT_

это просто доступ к таблице A "select colA from TableA" и проверка того, является ли значение "обновленным" для дальнейшей обработки..

1 Ответов

Рейтинг:
2

Wendelius

Если вы находитесь внутри одной и той же транзакции, то вы должны увидеть обновленное значение.

Попробуйте выполнить следующий тест

CREATE TABLE TableA (
   ColA nvarchar(100)
);

INSERT INTO TableA VALUES ('Empty');

CREATE PROCEDURE ProcB AS
DECLARE
   @currentvalue nvarchar(100);
BEGIN
   SELECT @currentvalue = ColA FROM TableA;
   PRINT 'ProcB: ' + @currentvalue + ', trancount: ' + CAST(@@trancount AS nvarchar(10));
END;

CREATE PROCEDURE ProcA AS
DECLARE
   @currentvalue nvarchar(100);
BEGIN
   BEGIN TRANSACTION;
   UPDATE TableA SET colA = 'Updated';
   EXEC ProcB
   ROLLBACK;
   SELECT @currentvalue = ColA FROM TableA;
   PRINT 'ProcA: ' + @currentvalue + ', trancount: ' + CAST(@@trancount AS nvarchar(10));
END;

EXEC ProcA

Результат должен быть
(1 row(s) affected)
ProcB: Updated, trancount: 1
ProcA: Empty, trancount: 0

Таким образом, исходя из этого, проблема лежит в другом. Проверьте например:
- Вы действительно находитесь внутри одной и той же транзакции, например, никакого связанного сервера не задействовано
- Действительно ли оператор UPDATE обновил какие-либо строки, сделана ли модификация
- Если речь идет о клаузуле WHERE, есть ли у вас те же условия и т. д...

Там, где это применимо, выведите промежуточные результаты и/или условия, чтобы убедиться, что путь кода выполняется должным образом.