web-dev-qa-db-fra.com

Erreur lors de la mise à jour des tables temporelles

J'ai mis en place les tables temporelles du système versé sur la table "Commandes". L'application utilise différents modèles d'accès pour modifier les données de ce tableau. Il existe des états directs provenant de la demande ou de l'application exécute de longs lots dans des transactions explicites dans lesquelles il apporte plusieurs modifications à plusieurs tables. La mise à jour sur la table "Commandes" n'est pas la première instruction dans ces lots longs! Donc, parfois, nous sommes confrontés à l'erreur suivante.

La modification des données a échoué sur la table "Commandes" de la version System, car le temps de transaction était précédemment que le temps de début de période des enregistrements concernés.

Apparemment, il s'agit d'un comportement standard des tables temporelles du système versé. https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=SQL-SERVER-2017#HOW-DOES-Temporal-work

Est-ce quelque chose qui aura toujours besoin d'être traité dans une routine d'exception? Ou Microsoft envisage-t-il de changer ce comportement?

--Script pour simuler le message d'erreur:

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
5
Danilo Braga

Est-ce quelque chose qui aura toujours besoin d'être traité dans une routine d'exception?

Les temps de début et de fin du système généré sont clés sur le temps du système du serveur pour le moment le BEGIN TRANSACTION est exécuté. Si vous avez des transactions à long terme, vous devriez:

  1. Construire en manipulation d'exception pouvant réessayer la transaction.

  2. Retravailler le code fautif pour qu'il s'exécute plus rapidement. Cela peut sembler beaucoup de travail, mais il sera nécessaire de faire certains niveau de retravailler pour gérer correctement les exceptions à base temporelle. Si vous allez faire une reprise, vous pouvez également déterminer pourquoi la transaction prend si longtemps et atténue ce comportement.

Ou Microsoft envisage-t-il de changer ce comportement?

Il n'existe aucun moyen de savoir ce que Microsoft fera dans les versions futures de leurs produits à moins d'avoir fait une annonce publique qui n'est pas couverte par un accord de non-contournement. Ils puissantes Modifier la fonctionnalité de la table temporelle à un moment donné à un moment donné, de sorte que les dates de début et d'extrémité sont réfléchissantes de l'heure actuelle du système au point d'insertion/mise à jour, cependant, ce n'est pas actuellement son fonctionnement. .

2
Max Vernon