代码之家  ›  专栏  ›  技术社区  ›  Brownie

在仅附加表中设置版本列

  •  2
  • Brownie  · 技术社区  · 16 年前

    我们有一个存储记录版本的表。

    各栏分别为:

    Id (Guid)
    VersionNumber (int)
    Title (nvarchar)
    Description (nvarchar)
    etc...
    

    我不确定如何最好地生成顺序VersionNumber值。我最初的想法是:

    SELECT @NewVersionNumber = MAX(VersionNumber) + 1
    FROM VersionTable
    WHERE Id = @ObjectId
    

    然后在insert语句中使用@NewVersionNumber。

    如果使用此方法,是否需要将事务设置为可序列化以避免并发问题?我不想以相同Id的重复版本号结束。

    有没有更好的方法不让我使用可序列化事务?

    2 回复  |  直到 16 年前
        1
  •  2
  •   John Sansom    16 年前

    为了避免并发问题(或者在特定情况下重复插入),您可以创建一个复合键作为表的主键,由ID和VersionNumber列组成。这将在键列上强制执行唯一约束。

        2
  •  2
  •   Community Mohan Dere    9 年前

    我原以为下面的单插入语句可以避免并发问题,但在Heinzi对 my question here 事实证明,这根本不安全:

    Insert Into VersionTable
    (Id, VersionNumber, Title, Description, ...)
    Select @ObjectId, max(VersionNumber) + 1, @Title, @Description
    From VersionTable
    Where Id = @ObjectId
    

    我把它留作参考。当然,这可以与表提示或可序列化的事务隔离级别一起使用,但总体而言,最好的解决方案是使用约束。