首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么加锁呢

2012-03-19 
如何加锁呢?SQL codeALTER PROCEDURE [dbo].[ProResultgoodsID]@ID int outputASBEGIN TRANSACTIONselect

如何加锁呢?

SQL code
ALTER PROCEDURE [dbo].[ProResultgoodsID]@ID int outputASBEGIN TRANSACTIONselect top 1 @ID=ID from goods WITH (rowlock)  where UploadState is nullset @ID=isnull(@ID,0)update goods WITH (rowlock) set UploadState='正在上传' where ID=@IDCOMMIT TRANSACTION



goods 表里有30万条记录,数据库文件大小为900M

我用5个线程同时不停的执行上面的存储过程,发现取出的ID有很多是重复的

如果用 WITH (TABLOCKX) 可以取出不重复的ID,但是执行存储过程是速度会很缓慢.goods 

我希望能实现的效果是:取出的ID值不重复.

[解决办法]
SQL code
1 如何锁一个表的某一行A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
[解决办法]
提高隔离级别
[解决办法]
如果将事务隔离级别设置为 SERIALIZABLE,并且在 SELECT 语句中使用表级锁定提示 NOLOCK,则键范围锁通常用于维护不采用可串行事务
SQL code
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --加上这一句BEGIN TRANSACTION
[解决办法]
性能和解决并发问题不可得兼,选一个适合你的

热点排行
Bad Request.