У нас есть хранимая процедура, которая вставляет данные в 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?