我正在 SQL Server (2008 R2) 中实现一个队列,其中包含要执行的作业。完成后,作业将移至历史表,设置成功或失败标志。队列表中的项目有一个标识列作为主键。历史队列具有此 id 和时间戳的组合作为 PK。
如果作业失败,我希望选择重新运行它,并且他们认为这是将其从历史记录表移回实时队列。出于可追溯性的目的,我希望重新插入的行具有与原始条目相同的 ID,这会导致问题,因为这是一个标识列。
我看到两种可能的解决方案:
1) 使用 IDENTITY_INSERT:
SET IDENTITY_INSERT TableName ON
-- Move from history to live queue
SET IDENTITY_INSERT TableName OFF
2) 创建一些自定义逻辑来生成唯一 ID,例如从实时队列和历史队列中获取最大 ID 值并添加一个。
我没有看到 2 有任何真正的问题,除了它很乱,可能性能很差,而且它让我神经质的皮肤爬行......
选项 1 我喜欢,但我不太清楚其中的含义。这将如何表现?而且我知道同时对两张桌子这样做会使事情崩溃和燃烧。如果两个线程同时对同一张表执行此操作会发生什么?
对于半常用的存储过程来说,这是否是一种很好的方法,或者这种技术是否应该只用于在蓝月亮中批量插入数据?
关于哪个是最好的选择,或者有更好的方法有什么想法吗?