Setting version column in append only table(在仅附加表中设置版本列)
问题描述
我们有一个表来存储记录的版本.
We have a table that will store versions of records.
列是:
Id (Guid)
VersionNumber (int)
Title (nvarchar)
Description (nvarchar)
etc...
保存项目将在表中插入一个新行,该行具有相同的 Id 和递增的 VersionNumber.
Saving an item will insert a new row into the table with the same Id and an incremented VersionNumber.
我不确定如何最好地生成连续的 VersionNumber 值.我最初的想法是:
I am not sure how is best to generate the sequential VersionNumber values. My initial thought is to:
SELECT @NewVersionNumber = MAX(VersionNumber) + 1
FROM VersionTable
WHERE Id = @ObjectId
然后在我的插入语句中使用@NewVersionNumber.
And then use the the @NewVersionNumber in my insert statement.
如果我使用这种方法,是否需要将我的事务设置为可序列化以避免并发问题?我不想最终得到相同 ID 的重复版本号.
If I use this method do I need set my transaction as serializable to avoid concurrency issues? I don't want to end up with duplicate VersionNumbers for the same Id.
有没有更好的方法来做到这一点,而不是让我使用可序列化的事务?
Is there a better way to do this that doesn't make me use serializable transactions?
推荐答案
为了避免并发问题(或在您的特定情况下重复插入),您可以创建一个复合键作为表的主键,由 ID 组成和 VersionNumber 列.然后,这将对键列强制执行唯一约束.
In order to avoid concurrency issues (or in your specific case duplicate inserts) you could create a Compound Key as the Primary Key for your table, consisting of the ID and VersionNumber columns. This would then enforce a unique constraint on the key column.
随后,您的插入例程/逻辑可以设计为处理或捕获由于重复键导致的插入错误,然后简单地重新发出插入过程.
Subsequently your insert routine/logic can be devised to handle or rather CATCH an insert error due to a duplicate key and then simply re-issue the insert process.
还值得一提的是,除非您特别需要使用 GUID,即因为使用 SQL Server 复制或多个数据源,否则您应该考虑使用替代数据类型,例如 BIGINT.
It may also be worth mentioning that unless you specifically need to use a GUID i.e. because of working with SQL Server Replication or multiple data sources, that you should consider using an alternative data type such as BIGINT.
这篇关于在仅附加表中设置版本列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在仅附加表中设置版本列
基础教程推荐
- 需要 MySQL 5.1 中的抽象触发器来更新审计日志 2021-01-01
- SQL Server 实例在登录协商期间返回无效或不受支持的协议版本 2021-01-01
- SSMS 中的权限问题:“对象 'extended_properties'、数据库 'mssqlsystem_resource'、... 错误 229)上的 SELECT 权限被拒绝" 2022-01-01
- 将 SQL Server DateTime 列迁移到 DateTimeOffset 2021-01-01
- 是否可以执行按位分组功能? 2021-01-01
- 如何使用 mysql.connector 禁用查询缓存 2022-01-01
- 无法解决整理冲突 2021-01-01
- SQL:使用来自具有相同列名的两个表中的数据... 2021-01-01
- 在 SQL 中连接多个表 2021-01-01
- SQL 效率:WHERE IN 子查询 vs. JOIN 然后 GROUP 2021-01-01
