郎咸武

郎咸武的博客

他的个人主页  他的博客

auto_increment 生成的ID 中间少了一部分

郎咸武  2010年11月03日 星期三 10:20 | 1576次浏览 | 3条评论

ID 越过---没有生成 id 为64的记录 请问为什么
tsung测试 ejabberd http插入 数据库接口

  1. ID 越过---没有生成 id 为 64 的记录 请问为什么  ????
  2. tsung测试 ejabberd http插入 数据库接口  
 

  1. Mysql代码 
  1.  +------------+--------------+------+-----+---------+----------------+  
  2. | Field         | Type         | Null | Key | Default | Extra          |  
  3. +------------+--------------+------+-----+---------+----------------+  
  4. | id              | int( 11 )      | NO   | PRI | NULL    | auto_increment |  
  5. | vname     | varchar( 128 ) | YES  | UNI | NULL    |                |  
  6. +------------+--------------+------+-----+---------+----------------+  

 


Mysql代码 
  1. select * from names where id like '6_'  order by id;  
  2. +----------+------------+  
  3. |     id     |    vname |  
  4. +----------+------------+  
  5. |        60  | test160    |  
  6. |        61  | test161    |  
  7. |        62  | test162    |  
  8. |        63  | test163    |  
  9. |        65  | test164    |  
  10. |        66  | test165    |  
  11. |        67  | test166    |  
  12. |        68  | test167    |  
  13. |        69  | test168    |  
  14. +----------+------------+  
 

 

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
郎咸武

回复 郎咸武  2010年11月04日 星期四 09:43


这个与数据库内部实现机制有关。这个自增的字段属于临界资源,肯定是受内部并发控制锁来进行控制的。 再加上一定的缓存机制,可能前一个操作会预先分配了65和66,后一个操作只得到67,然后前一个操作只用了65,那么66就没有人再用力
oracle里面这个情况很常见。
是的。
它可能预分配资源,为了保持效率

2条回复

  • 达伦王

    回复 达伦王  2010年11月04日 星期四 13:08

    应该是跟缓存有关的,就算自己实现id generator也会考虑缓冲一个区间的id,当缓存因为某种原因清掉之后, 下回肯定是从上次缓存区间段末尾的下一个位置开始

    1条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号