web-dev-qa-db-ja.com

テンポラルテーブルの更新中にエラーが発生しました

「バージョン」テーブルにシステムバージョンのテンポラルテーブルを実装しました。アプリケーションは、さまざまなアクセスパターンを使用して、このテーブルのデータを変更しています。アプリケーションからの直接のステートメントがあるか、アプリケーションが複数のテーブルにいくつかの変更を加える明示的なトランザクションで長いバッチを実行しています。 「注文」テーブルの更新は、これらの長いバッチの最初のステートメントではありません。したがって、次のエラーが発生することがあります。

トランザクション時間が影響を受けるレコードの期間の開始時間よりも早いため、システムバージョン対応のテーブル「注文」でデータの変更に失敗しました。

どうやらこれはシステムバージョン対応テンポラルテーブルの標準的な動作です。 https://docs.Microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017#how-does-temporal-work

これは常に例外ルーチンで処理する必要があるものですか?またはマイクロソフトはその動作を変更することを検討していますか?

-エラーメッセージをシミュレートするスクリプト:

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

これは常に例外ルーチンで処理する必要があるものですか?

システムで生成された開始時刻と終了時刻は、BEGIN TRANSACTIONが実行された瞬間のサーバーのシステム時刻に対応しています。実行時間の長いトランザクションがある場合は、次のことを行う必要があります。

  1. トランザクションを再試行できる例外処理を組み込みます。

  2. 問題のあるコードを修正して、より速く実行できるようにします。これは多くの作業のように聞こえるかもしれませんが、時間ベースの例外を正しく処理するためにsomeレベルのやり直しを行う必要があります。やり直す場合は、トランザクションに時間がかかる理由を特定して、その動作を軽減することもできます。

またはマイクロソフトはその動作を変更することを検討していますか?

マイクロソフトが機密保持契約の対象外となる公式発表を行わない限り、マイクロソフトの製品の将来のバージョンで何が行われるかを知る方法はありません。それらはmightテンポラルテーブルの機能を将来のある時点で変更して、開始日と終了日が挿入/更新の時点での現在のシステム時間を反映するようにしますが、現時点では機能していません。

2
Max Vernon