首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误更新时态表

错误更新时态表
EN

Database Administration用户
提问于 2018-07-05 18:46:44
回答 1查看 9.1K关注 0票数 12

我已经在表"Orders“上实现了系统版本的时态表。应用程序正在使用不同的访问模式来修改此表中的数据。有来自应用程序的直接语句,或者应用程序在显式事务中运行长批,其中对多个表进行了多次更改。"Orders“表上的更新不是长批中的第一个语句!因此,有时我们面临以下错误。

数据修改在系统版本表"Orders“上失败,因为对受影响记录的事务处理时间早于期间开始时间。

显然,这是系统版本时态表的标准行为。https://learn.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017#how-does-temporal-work

这是否总是需要在异常例程中处理?还是微软正在考虑改变这种行为?

-模拟错误消息的脚本:

代码语言:javascript
复制
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
EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-07-05 19:40:00

这是否总是需要在异常例程中处理?

在执行BEGIN TRANSACTION时,系统生成的开始和结束时间与服务器的系统时间进行键控。如果您有长期运行的事务,您应该:

  1. 生成可以重试事务的异常处理。
  2. 重新工作违规的代码,使其执行得更快。这听起来可能是很多工作,但为了正确处理基于时态的异常,有必要进行某种程度的重新工作。如果要进行返工,最好确定事务花费这么长时间的原因,并减轻这种行为。

还是微软正在考虑改变这种行为?

没有办法知道微软将在他们的产品的未来版本中做些什么,除非他们已经发布了一份未被保密协议涵盖的公开声明。它们可能会在将来的某个时候修改时态表功能,以便开始日期和结束日期反映插入/更新时的当前系统时间,但是目前它不是这样工作的。

票数 8
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/211467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档