Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql中发生回滚时如何重置自动递增的Id_Sql Server - Fatal编程技术网

Sql server 在sql中发生回滚时如何重置自动递增的Id

Sql server 在sql中发生回滚时如何重置自动递增的Id,sql-server,Sql Server,当我尝试在表中插入新行时,如果此事务中发生任何异常,则数据将回滚 现在,当下次成功插入新条目时,将使用下一个值更新AutoIncrement id。表示表中的两个consequetive唯一Id之间存在间隙 有什么有效的方法来克服这个问题吗 提前谢谢答案必须是否定的 标识列的整个概念是没有意义的,并且是事务不可知的——这样就可以在不考虑其他事务是否回滚的情况下抛出这些数字。想象一下,每秒1000次插入的系统在每次事务插入时被延迟10毫秒,以决定是否提交!fyi 10ms*100=1s 注意:在撰

当我尝试在表中插入新行时,如果此事务中发生任何异常,则数据将回滚

现在,当下次成功插入新条目时,将使用下一个值更新AutoIncrement id。表示表中的两个consequetive唯一Id之间存在间隙

有什么有效的方法来克服这个问题吗


提前谢谢

答案必须是否定的

标识列的整个概念是没有意义的,并且是事务不可知的——这样就可以在不考虑其他事务是否回滚的情况下抛出这些数字。想象一下,每秒1000次插入的系统在每次事务插入时被延迟10毫秒,以决定是否提交!fyi 10ms*100=1s

注意:在撰写本文时的SQL Server 2012最新SP/修补程序级别中,此处有一个与标识相关的功能

甚至在2012年之前,您甚至不需要回滚来使用标识值-请参见此处

出于同样的原因,这也适用于其他主要RDBMS,例如:

重要提示:为了避免阻止从同一序列获取数字的并发事务,nextval操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为已被使用,即使执行下一次调用的事务稍后中止。这意味着中止的事务可能会在分配的值序列中留下未使用的漏洞


emphasis mine

我99.9%确信,如果MySQL或PostgreSQL失败,它们都会回滚。我不确定为什么SQL Server不能做到这一点,但他们可以做到。我同意。从dual中简单选择mySequence.NextVal;将耗尽该值。试试看。在您的oracle世界中运行此查询3次。@RichardTheKiwi我刚刚测试了它以确保。PostgreSQL在插入之前验证插入。如果您创建一个varchar10列,插入一个超过10个字符的字符串,然后插入一个有效记录,则得到ID 1。在SQL Server中,您得到的ID是2。@Phill我特意画了一条线,让PostgreSQL注释自己留下。它指的是序列中的间隔,而不是SQL Server两个怪癖中任何一个的再现性。@RichardTheKiwi-ah好的。你的链接对我来说没有多大意义。连载的笔记对我来说更有意义——记起来很好。干杯。你必须使用TRY,CATCH-block。这首先是个什么问题?SQL Server不这样做。有关快速解释和实际问题场景,请参阅。如果您绝对要求ID中没有空白,那么您必须为其编写自己的逻辑,然后确定删除记录时要做什么。唯一需要克服的问题是您的期望中的问题。标识列应该被认为是不透明的blob,可以存储在int变量中。应尽可能忽略这些列中包含的实际值。