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

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



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



在网上搜索了一下,发现这个帖子和我的情况几乎一致,但貌似并没有解决。
这是怎么回事呢?
...全文
743 点赞 收藏 26
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
自增长缓存了一批值
回复
加载更多回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-07-22 05:14
社区公告
暂无公告