【发布时间】:2011-05-10 20:45:37
【问题描述】:
我们有一个表和一组用于生成 pk id 的程序。表保存最后一个 id,过程获取 id,增加它,更新表,然后返回新增加的 id。
此过程可能在事务中。问题是,如果我们有回滚,它可能会回滚到在事务期间使用的任何 id 之前的 id(比如从不同的用户或线程生成)。那么当id再次递增时,会导致重复。
有没有办法从父事务中排除 id 生成表以防止这种情况发生?
添加细节我们当前的问题...
首先,我们有一个准备将大量数据迁移到其中的系统。该系统由一个 ms-sql (2008) 数据库和一个 textml 数据库组成。 sql 数据库存储不到 3 天的数据,而 textml 充当任何更早的数据的存档。 textml db 还依赖于 sql db 为特定字段提供 id。这些字段当前是 Identity PK 的,并且在发布到 texml 数据库之前在插入时生成。我们不想通过 sql 清洗所有迁移的数据,因为记录会在流量和数据方面淹没当前系统。但与此同时,我们无法生成这些 id,因为它们是 sql server 控制的自动递增值。
其次,我们有一个系统要求,需要我们能够将旧资产从 texml 数据库中提取出来,并使用原始 ID 将其插入到 sql 数据库中。这样做是为了更正和编辑,如果我们更改 id,它将破坏我们无法控制的客户端系统下游的关系。当然这都是个问题,因为 id 列是 Identity 列。
【问题讨论】:
-
您使用的是什么关系型数据库?它是否具有内置的自动增量功能,您可以使用而不是尝试自己滚动?
-
Joe 是对的——这就是为什么大多数 RDBMS 都有内置的
Identity类型函数。 -
如果您有确定何时发生回滚的逻辑,您可以使用/在相同的逻辑内将表设置回原始值。
-
不确定这是否是一个好的解决方案 - 我自己不会这样做。但是,如果您'必须做您必须做的事情',您可能希望改用 Timestamp 列(二进制),并以某种方式将其转换为 int。即使您回滚父事务,该值也不会重复。
标签: sql transactions rollback