sql server 2012 表的标识列自增异常

amplifer 2015-07-22 05:14:05
使用的是SQL Server 2012,有一张表的id列设置了标识列,自增种子为1,如下图。



一直使用正常,今天新增一条记录,发现ID一下跳了接近1000,如下图。



在网上搜索了一下,发现这个帖子和我的情况几乎一致,但貌似并没有解决。
这是怎么回事呢?
...全文
926 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
szkangdun_cn 2017-04-20
  • 打赏
  • 举报
回复
我也遇到相同的问题了,程序没有问题. 出现的数据跟你的都是一样的
qq_33336775 2016-01-06
  • 打赏
  • 举报
回复
插入失败回滚也会占用位置
amplifer 2015-12-24
  • 打赏
  • 举报
回复
我把表删了重建,还是不行,最近依然在跳记录。
misterliwei 2015-08-25
  • 打赏
  • 举报
回复
https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity https://multidimensionalmayhem.wordpress.com/2012/10/16/another-stop-gap-solution-for-the-sql-server-2012-identity-crisis/
gw6328 2015-08-25
  • 打赏
  • 举报
回复
希望微软来论坛收集bug.
这个我也遇到了。

Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
Apr 20 2015 17:29:27
Copyright (c) Microsoft Corporation
Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

gw6328 2015-08-24
  • 打赏
  • 举报
回复
还没找到原因啊- -!
amplifer 2015-08-24
  • 打赏
  • 举报
回复
还是没有找到原因,太诡异了。
nzperfect 2015-08-04
  • 打赏
  • 举报
回复
印象中如果sql server是alwayson,那么在切换时,会有自动增加1000。
amplifer 2015-08-03
  • 打赏
  • 举报
回复
引用 17 楼 jinfengyiye 的回复:
经常出现这种跳你是否查看一下你程序是否有问题,比如某个地方一下插入1000,然后又是失败的这种情况
我也检查了代码,关于这个表的代码就一句简单的insert操作,真是奇了怪了。

$sql = "insert into cclog (cc_id, cc_time, log_content, recorder, timestamp) values (" . $cc_id . ", '" . $log_date . "', '" . $log_content . "', '" . $log_recorder . "', '" . $timestamp . "')";
gw6328 2015-07-30
  • 打赏
  • 举报
回复
经常出现这种跳你是否查看一下你程序是否有问题,比如某个地方一下插入1000,然后又是失败的这种情况
amplifer 2015-07-30
  • 打赏
  • 举报
回复
引用 15 楼 Tiger_Zhao 的回复:
任何事务原因的事务回滚就行。
记下INSERT语句,记下COMMIT成功,两者的数量差就是跳过的ID个数。

强迫症患者表示伤不起,又跳了。。
Tiger_Zhao 2015-07-24
  • 打赏
  • 举报
回复
任何事务原因的事务回滚就行。
记下INSERT语句,记下COMMIT成功,两者的数量差就是跳过的ID个数。
amplifer 2015-07-24
  • 打赏
  • 举报
回复
引用 13 楼 Tiger_Zhao 的回复:
既然你这么肯定没有其它的途径插入数据。 那么在程序中记录日志啊,不仅成功的操作,把所有的插入操作都记录下来,统计下成功数和失败数,是否和ID一致。
不好意思我没太明白,你的意思是插入失败导致的ID跳变吗?
amplifer 2015-07-23
  • 打赏
  • 举报
回复
引用 11 楼 Tiger_Zhao 的回复:
一个事务不会只操作一个表啊。比如: A调试程序,正好长时间中断在锁定表二之后。 B往表一插入一条记录(自增了),再去更新表二时锁冲突,回滚。 这就断号了。 只要A锁定的这段时间中B反复操作,就会跳过很长一段ID。
好像很有道理,不过不太符合我的情况。因为这个小系统是我前段时间自己写的,最近都没有调试过,处于正常使用中。 其他人并没有数据库管理权限,只有网页新增的权限。并且就几个用户,使用频率不高的情况,跳过1000行,这个难以理解。
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
一个事务不会只操作一个表啊。比如:
A调试程序,正好长时间中断在锁定表二之后。
B往表一插入一条记录(自增了),再去更新表二时锁冲突,回滚。
这就断号了。
只要A锁定的这段时间中B反复操作,就会跳过很长一段ID。
amplifer 2015-07-23
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
自增只保证唯一,没有义务保证连号。 你能保证网页的插入操作永不出错不(包括多用户加锁冲突)?
感谢回复,你是指多用户同时新增记录的时候出现冲突吗? 这个可能性不大,现在只是个简单测试系统,目前就身边几个人在用,频率并不高。 并且如果A和B用户同时插入数据,sql server的确是能保证ID不重复,但是为什么会跳过这这么多ID呢?还是没太明白...
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
自增只保证唯一,没有义务保证连号。
你能保证网页的插入操作永不出错不(包括多用户加锁冲突)?
amplifer 2015-07-23
  • 打赏
  • 举报
回复
引用 6 楼 Cherise_huang 的回复:
。。。。我问过了,都这么久还没人回答
引用 7 楼 luckyrandom 的回复:
自增长缓存了一批值
感谢回复,可以说的更详细些吗?如何让这一列正常自增1呢?
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
既然你这么肯定没有其它的途径插入数据。
那么在程序中记录日志啊,不仅成功的操作,把所有的插入操作都记录下来,统计下成功数和失败数,是否和ID一致。
Q315054403 2015-07-22
  • 打赏
  • 举报
回复
自增长缓存了一批值
加载更多回复(6)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧