Предотвратить тупик между хранимой процедурой и выполнением представления - PullRequest
0 голосов
/ 10 апреля 2019

У нас есть хранимая процедура, которая вставляет данные в 3 таблицы (некоторые части хранятся в отдельных таблицах, управление версиями при обновлении):

CREATE PROCEDURE [dbo].[SpecialOrders_Insert]
    @lastName nvarchar(100),
    @firstName nvarchar(100),
    @productId int,
    @blabla nvarchar(100),
    @special1 nvarchar(100),
    @special2 nvarchar(100),
    @special3 nvarchar(100),
    @changedBy int
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    DECLARE @lastChangedDate datetime = GetDate();
    DECLARE @identity int

    BEGIN TRAN;

        -- Place Order-Head
        INSERT INTO dbo.Orders_H 
                    (LastName
                    , FirstName
                    , ProductId) 
        VALUES 
                    (@lastName,
                    @firstName,
                    @productId);

        SET @identity = SCOPE_IDENTITY();

        -- Place Order-Data (expect lot more data here)
        INSERT INTO dbo.Orders_D
                    (ParentId
                    , Blabla
                    , LastChangedDate
                    , LastChangedBy
                    , ValidFrom
                    , ValidTo)
        VALUES
                    (@identity
                    , @blabla
                    , @lastChangedDate
                    , @changedBy
                    , @lastChangedDate
                    , null);


        INSERT INTO dbo.SpecialOrders_D
                    (ParentId
                    , Special1
                    , Special2
                    , Special3
                    , LastChangedDate
                    , LastChangedBy
                    , ValidFrom
                    , ValidTo)
        VALUES
                    (@identity
                    , @special1
                    , @special2
                    , @special3
                    , @lastChangedDate
                    , @changedBy
                    , @lastChangedDate
                    , null);

    COMMIT TRAN;
END

И несколько просмотров, которые всегда читают текущие версии, такие как: CREATE VIEW [dbo]. [SpecialOrders] AS

    SELECT 
        -- Orders_H
        h.Id, h.LastName, h.FirstName, h.ProductId,

        -- Orders_D (expect lot more columns here)
        d.Blabla, 

        -- Specialorders (also here more data expected)
        s.Special1, s.Special2, s.Special3

    FROM Orders_H h
         left join Orders_D d ON h.Id = d.ParentId
         left join SpecialOrders_D s ON d.ParentId = s.ParentId

    WHERE d.ValidTo is null and s.ValidTo is null

В настоящее время мы сталкиваемся с тупиками, когда SP вставляет данные, а представление считывает данные одновременно. Sp хранит монопольную блокировку для Orders_H, в то время как представление хранит общую блокировку для Orders_D.

Как я могу изменить представление так, чтобы оно гарантировало чтение данных в правильном порядке: Orders_H, Orders_D, Specialorders?

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