【发布时间】:2011-04-28 16:53:54
【问题描述】:
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 rollback
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 rollback
不,也不应该……
身份的生成必须在事务之外,否则将无法工作。
【讨论】:
回滚不会重置种子值(这意味着身份值将存在间隙)。
示例:如果插入 5 行,其标识值为:
5, 6, 7, 8, 9
并进行回滚,即使缺少 5 - 9,下一个标识值仍将是 10。
【讨论】:
不,您不希望它重复使用它们。永远不应假定身份没有间隙(它们也不会被重用于删除)。
这些差距对任何人都不重要。如果有人要求使用此功能,请解释说手动创建 id 需要进行大量且昂贵的更改,并且由于竞争条件,该更改将有很大的数据完整性问题风险。此外,这种昂贵且冒险的改变绝对不会产生任何收益。系统运行速度会变慢(手动生成 id 需要更长的时间,特别是如果您要填补空白),并且如果您重复使用已删除的 id 并且由于其他人没有删除子记录,则数据可能会错位的风险很大认为正式执行 PK/FK 关系是一个坏主意(或者只是错过了一张桌子)。这是我个人不会接受的要求。这对数据来说太危险了。
【讨论】:
不,这是有充分理由的。假设有两个事务处于活动状态,每个事务都使用相同的身份。假设事务 1 抓取数字 (1, 3, 4, 7, 9),事务 2 抓取 (2, 5, 6, 8)。然后回滚事务 2。身份应该回滚到什么位置?如果重新设置身份以使“下一个”值是事务分配的第一个或最后一个值,则下一个从身份中获取数字的程序在尝试使用该数字时可能会遇到某种类型的密钥违规。由于这个原因,身份号码分配不会被交易。
分享和享受。
【讨论】: