"select isnull(max(cast(cls_num as int)),1000000)+1 as newid from  classes"
新增数据的时候先取最大id,然后把id加1作为新id插入,
但是如果两个用户并发操作,新增数据的时候大家都是取到相同的最大id。
添加数据的时候又添加相同的id,如何处理:如果相同id到达,先保存一条数据,然后把另一id再自动加一保存。
怎样用sql处理?如果存在相同id就把id+1
Insert Into classes (id,name ) values '"& maxid &"' ,'"& name &"'
如何让sql自动处理?

解决方案 »

  1.   

    进行加锁
    select isnull(max(cast(cls_num as int)),1000000)+1 as newid from  classes with (xlock,tablock)
      

  2.   

    declare @err int 
    set @err=0
    begin tran
      --查询赋值操作
    set @err=@err+abs(@@error)
       --插入操作
    set @err=@err+abs(@@error)
    if @err=0
       commit
    else
       rollback
      

  3.   

    4楼正解,就算是两个相同的客户端同时读到同一个最大值,那也只有第一个提交的能成功,
    不需要自己加锁,SQL会控制这种并发修改的。
      

  4.   

    declare @err int 
    set @err=0
    begin tran
      --查询赋值操作
    set @err=@err+abs(@@error)
       --插入操作
    set @err=@err+abs(@@error)
    if @err=0
       commit
    else
       rollback这段怎样执行SQL语句啊?
      

  5.   

    用sequence,提交的时候只有一条才能成功的
      

  6.   


    比如:sqlcommand sqlComd = new sqlcommand();
    try
    {
    sqlComd.begintrancate();事务开始...
    ....招待存储过程
    ...
    SqlComd.commit();事务提交
    sqlComd.endtrancate();事务结束
    }
    catch
    {
    sqlComd.rollback();
    }