zoukankan      html  css  js  c++  java
  • 事务回滚后,自增ID仍然增加

    回滚后,自增ID仍然增加。

    比如当前ID是7,插入一条数据后,又回滚了。
    然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.
    因为虽然你之前插入回滚,但是ID还是自增了。


    如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞。比如下面的例子,A表使用自增ID。
    User 1
    ------------
    begin transaction
    insert into A ...
    insert into B ...
    update C ...
    insert into D ...
    commit


    User 2
    -----------
    begin transaction
    insert into A ...
    insert into B ...
    commit


    看以上的例子代码,如果自增ID也要被事务化,那么假设user 2 的事务在user 1执行后的1毫秒后执行,那么他的插入到A表不得不等待User 1的整个事务结束,检查第一个自增ID是不是被使用了。这就导致阻塞。

    自增ID不被事务化是设计使然,不是bug,如果需要紧密连续的自增序列,建议采用其他方法生成。

    --不連續沒關係,需要時候生成一列
    if object_id(tb)is not null drop table tb
    go
    create table tb(ID int )
    insert tb select 1
    insert tb select 2
    insert tb select 5
    insert tb select 18
    insert tb select 13
    select id ,[newid]=(select count(*) from tb where id<=t.id) from tb t order by [newid]
    /*id          newid       
    ----------- ----------- 
    1           1
    2           2
    5           3
    13          4
    18          5

    (影響 5 個資料列)
    */

    参考:http://www.jb51.net/article/27138.htm

  • 相关阅读:
    一个简单的MVVM雏形
    sass学习笔记1
    col标签的相关实验
    背景半透明rgba最佳实践
    angular性能优化心得
    环视非捕获分组
    5月23日Google就宣布了Chrome 36 beta
    浏览器 user-agent 字符串的故事
    迷你MVVM框架 avalonjs 沉思录 第3节 动态模板
    迷你MVVM框架 avalonjs 1.3.1发布
  • 原文地址:https://www.cnblogs.com/youxin/p/4059595.html
Copyright © 2011-2022 走看看