大家请看这里噢,:)
请问,查询最大值时,是否需要对表进行加锁。
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
sql server本身select或insert时就会产生锁,是不?
select insert 加锁
请问,查询最大值时,是否需要对表进行加锁。
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
sql server本身select或insert时就会产生锁,是不?
select insert 加锁
调试欢乐多
--> 不一定,看查询语句的写法. select max([字段]) from [表名] --> 加锁
select max([字段]) from [表名](nolock) --> 不加锁
因为考虑到查询最大值时,可能会同时有新插入的记录,这样查询的最大值是否准确?
--> 相对于查询的那个时刻,是最大值.
相对于现在,不一定是最大值.sql server本身select或insert时就会产生锁,是不?
--> 是的.
目的是想先查询到最大值,再将其增1后插入到另一个表中。declare @a int
SELECT @a=MAX(account)
FROM 表1insert 表2(name,account) values('张三',@a+1)其中,字段account未设置为表的索引。
请问,在以上情况下,需要使用表锁定吗?如果需要,在哪里使用呢?
SELECT @a=MAX(account) FROM 表1
insert 表1(name,account) values('张三',@a+1)
那就在页面上加锁限定如何?以防止出现重复的account
思路是,使用编程语言是c#,在页面中使用Application.lock()与Application.unlock(),将获取最大值的代码放在其中。这样,保证同一时间只有一个用户能访问到这个最大值。
如果是sqlserver2012 推荐使用SequenceNumber
如果是sql2000考虑自增长,
实在不行的话,用一个表来维护编号,写个存储过程,每次取了就加1 (我经常用这招)
UPDATE tbID SET @id_value=id_value=id_value+1
WHERE table_name=@table_name
或者使用以下语句如何?select top 1 @MaxManageAccount=account
from 表1 with(updlock)
order by Convert(int,account) desc
非常感谢楼上各位!