大家请看这里噢,:)
请问,查询最大值时,是否需要对表进行加锁。
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
sql server本身select或insert时就会产生锁,是不?
select insert 加锁

解决方案 »

  1.   

    锁是肯定加的,但是不一定是锁定表。如果是MAX的字段是Clustered Index的话,一条记录就可以得到值了。如果不是的话可能需要INDEX SCAN或者TABLE SCAN需要锁定表的数据。 
      

  2.   

    请问,查询最大值时,是否需要对表进行加锁。
    --> 不一定,看查询语句的写法. select max([字段]) from [表名] --> 加锁
     select max([字段]) from [表名](nolock) --> 不加锁
    因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
    --> 相对于查询的那个时刻,是最大值.
        相对于现在,不一定是最大值.sql server本身select或insert时就会产生锁,是不?
    --> 是的.
      

  3.   

    学习了!
    目的是想先查询到最大值,再将其增1后插入到另一个表中。declare @a int
    SELECT @a=MAX(account) 
    FROM 表1insert 表2(name,account) values('张三',@a+1)其中,字段account未设置为表的索引。
    请问,在以上情况下,需要使用表锁定吗?如果需要,在哪里使用呢?
      

  4.   

    不好意思,应该是在同一个表中查询最大值,然后增1插入到该表中。declare @a int
    SELECT @a=MAX(account)  FROM 表1   
    insert 表1(name,account) values('张三',@a+1)
      

  5.   

    这样在高并发时,可能会产生重复的account值喔.
      

  6.   

    非常感谢噢!
    那就在页面上加锁限定如何?以防止出现重复的account
    思路是,使用编程语言是c#,在页面中使用Application.lock()与Application.unlock(),将获取最大值的代码放在其中。这样,保证同一时间只有一个用户能访问到这个最大值。
      

  7.   

    或者说,在数据库端,有更可靠的办法吗?防止出现重复的account 
      

  8.   

    取最大值作为插入数据的新值是不可取的,在并发时会重复
    如果是sqlserver2012 推荐使用SequenceNumber
    如果是sql2000考虑自增长,
    实在不行的话,用一个表来维护编号,写个存储过程,每次取了就加1 (我经常用这招)
     UPDATE tbID SET @id_value=id_value=id_value+1
    WHERE table_name=@table_name
      

  9.   

    哦,表中已有一个字段为自增列了,account字段就不能设置为自增列了;
    或者使用以下语句如何?select top 1 @MaxManageAccount=account 
    from 表1 with(updlock) 
    order by Convert(int,account) desc
      

  10.   

    嗯,将以上的select语句放置在存储过程中,页面再加锁限制一下。
    非常感谢楼上各位!