Implementei as Tabelas Temporais com Versão do Sistema na tabela "Pedidos". O aplicativo está usando diferentes padrões de acesso para modificar os dados nesta tabela. Existem instruções diretas vindas do aplicativo ou o aplicativo está executando longos lotes em transações explícitas nas quais ele faz várias alterações em várias tabelas. A atualização na tabela "Pedidos" não é a primeira declaração nesses lotes longos! Então, às vezes estamos enfrentando o seguinte erro.
A modificação de dados falhou na tabela com versão do sistema "Pedidos" porque o horário da transação foi anterior ao horário de início do período para os registros afetados.
Aparentemente, esse é um comportamento padrão das tabelas temporais com versão do sistema. https://learn.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017#how-does-temporal-work
Isso é algo que sempre precisará ser tratado em uma rotina de exceção? Ou a Microsoft está pensando em mudar esse comportamento?
--Script para simular a mensagem de erro:
CREATE TABLE dbo.Orders
(
[OrderId] INT NOT NULL PRIMARY KEY CLUSTERED
, [OrderValue] DECIMAL(19,4)
, [ValidFrom] DATETIME2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] DATETIME2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.OrdersHistory));
GO
INSERT dbo.Orders ([OrderId], [OrderValue])
VALUES (1, 9.99), (2, 9.99);
GO
SELECT * FROM dbo.Orders;
GO
--Run first query
BEGIN TRAN
WAITFOR DELAY '00:00:15';
UPDATE dbo.Orders
SET [OrderValue] = [OrderValue] + 1;
COMMIT TRAN
--Run Query 2 in another session sql server
BEGIN TRAN
UPDATE dbo.Orders
SET [OrderValue] = [OrderValue] + 1;
COMMIT TRAN
As horas de início e término geradas pelo sistema são codificadas para a hora do sistema do servidor no momento em que
BEGIN TRANSACTION
é executado. Se você tiver transações de longa duração, você deve:Construir no tratamento de exceção que pode repetir a transação.
Retrabalhe o código incorreto para que ele seja executado mais rapidamente. Isso pode parecer muito trabalho, mas será necessário fazer algum nível de retrabalho para lidar corretamente com exceções baseadas em tempo. Se você for fazer retrabalho, também pode determinar por que a transação está demorando tanto e mitigar esse comportamento.
Não há como saber o que a Microsoft fará em versões futuras de seus produtos, a menos que tenha feito um anúncio público que não seja coberto por um contrato de confidencialidade. Eles podem modificar a funcionalidade da tabela temporal em algum momento no futuro, de modo que as datas de início e término reflitam a hora atual do sistema no ponto de inserção/atualização, mas não é assim que funciona atualmente.