查询最大值是否需要对表进行锁定?
大家请看这里噢,:)
请问,查询最大值时,是否需要对表进行加锁。
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
sql server本身select或insert时就会产生锁,是不?
------解决方案--------------------锁是肯定加的,但是不一定是锁定表。如果是MAX的字段是Clustered Index的话,一条记录就可以得到值了。如果不是的话可能需要INDEX SCAN或者TABLE SCAN需要锁定表的数据。
------解决方案--------------------请问,查询最大值时,是否需要对表进行加锁。
--> 不一定,看查询语句的写法.
select max([字段]) from [表名] --> 加锁
select max([字段]) from [表名](nolock) --> 不加锁
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
--> 相对于查询的那个时刻,是最大值.
相对于现在,不一定是最大值.
sql server本身select或insert时就会产生锁,是不?
--> 是的.
------解决方案--------------------取最大值作为插入数据的新值是不可取的,在并发时会重复
如果是sqlserver2012 推荐使用SequenceNumber
如果是sql2000考虑自增长,
实在不行的话,用一个表来维护编号,写个存储过程,每次取了就加1 (我经常用这招)
UPDATE tbID SET @id_value=id_value=id_value+1
WHERE table_name=@table_name
------解决方案--------------------如果已经有了一个自增列了
那就用存储过程来维护吧