SQL Server - изменения не отражаются каждый раз, пока вручную не выполняется CHECKPOINT - PullRequest
0 голосов
/ 14 октября 2019

У меня проблема с процедурой SQL Server.

У меня есть две новые хранимые процедуры, когда процесс PROC_Main выполняет несколько операций вставки и обновления перед вызовом PROC_child чтобы вытащить обновленные записи обратно.

--Child PROC
    CREATE PROCEDURE dbo.Proc_Child
    @Id int
    AS
    BEGIN
        SELECT * FROM dbo.Employee WHERE Id = @Id AND Status=1
    END



--Parent Proc 
CREATE PROCEDURE dbo.Proc_Main
    @Id int ,@Status varchar(100),@Date datetime
AS
BEGIN
BEGIN TRY
BEGIN TRAN

    IF NOT EXISTS (SELECT Id FROM dbo.Employee WHERE Id = @Id)
    BEGIN

        UPDATE dbo.Employee 
            SET Status = 3, 
                Date = getdate()
        WHERE Status <> 3 
          AND Id = @Id

        INSERT INTO dbo.Employee (ID,Status,Date)
        VALUES (@ID,@Status,@Date)
    END

    COMMIT
    --CHECKPOINT;
    EXEC dbo.Proc_Child @Id = @Id
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN

    DECLARE @Message VARCHAR(1000) = ERROR_MESSAGE()
    DECLARE @Severity INT = ERROR_SEVERITY()
    DECLARE @State INT = ERROR_STATE()

    RAISERROR(@Message, @Severity, @State)
END CATCH
END

--Procedure call
EXEC Proc_Main @ID=1,@Status=1,@Date='2019-01-01'

Я сталкиваюсь с проблемой, что Proc_Main не возвращает записи из PROC_Child каждый раз.

Когда я выполняю контрольную точку вручнуюперед вызовом Proc_Child только записи возвращаются.

1 Ответ

0 голосов
/ 14 октября 2019

Ничего общего с контрольной точкой. Исходя из вашего кода, если вы вызовете main proc с Status! = 1, ваш дочерний proc не вернет его. Кроме того, почему вы делаете update, если вы знаете, что запись не существует? Наконец, в многопоточной среде это может взорваться, вам нужно заблокировать идентификатор при проверке на существование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...