【发布时间】:2018-09-18 08:54:28
【问题描述】:
我有一个名为Entity 的实体表,如下所示:
Entity
---------------------------
id (uniqueidentifier)
name (varchar(32))
description (varchar(max))
我想添加一个record book 或log 表来存储实体的所有版本,命名为EntityLog
EntityLog
-------------------------
version ???
entityId (uniqueidentifier) fk Entity
name (varchar(32))
description (varchar(max))
EntityLog的版本栏只是一个草图,因为它还不存在所以可以操作。
如何根据外键 EntityId 自动分配版本,以便插入自动将版本从 1 更新到 2,依此类推,EntityId 没有每个表?
尽可能避免竞争条件,上下文包括多线程应用程序
编辑
尝试解决它:
- 读取最大版本
select max(version) from entityLog where entityId = myId - 插入
EntityLog之前读取的数字 + 1,如果为 null,则只需 1
在 1 和 2 之间可能存在竞争条件,因此我希望委托给 SQL Server 一种像这样插入的线程安全方式
【问题讨论】:
-
您如何确定版本号何时不同?在每次插入 EntityLog 时?
-
@AdinugrahaTawaqal 是的,第一个插入对应于第一个版本(编号 1)等等
-
您可以在 EntityLog 上使用普通标识列,当您想按所述列显示版本号顺序并使用 ROWNUMBER() 函数作为版本时。 docs.microsoft.com/en-us/sql/t-sql/functions/…
-
如果您关心准确性 MAX(Col) + 1 不是一个好方法。也许您只需要一个日期时间列来记录添加 EntityLog 的时间。然后,您可以使用 ROW_NUMBER 创建一个计算列,并按 entityID 对其进行分区。
-
@AdinugrahaTawaqal 我最后添加了一个标识列和一个存储过程,其中 rownumber() 由 entityId 分区以实现版本控制。感谢您的提示,您可以发布作为答案,我很乐意接受它
标签: sql-server multithreading foreign-keys primary-key composite-primary-key