日期:2014-05-18 浏览次数:20567 次
1 如何锁一个表的某一行 A 连接中执行 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran select * from tablename with (rowlock) where id=3 waitfor delay '00:00:05' commit tran B连接中如果执行 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) 其他事务不能读取表,更新和删除
------解决方案--------------------
set transaction isolation level repeatable
------解决方案--------------------
做个例子,供参考.
create table chp845 (id int, de varchar(5)) insert into chp845 select 1,'aa' union all select 2,'bb' select * from chp845 id de ----------- ----- 1 aa 2 bb set transaction isolation level serializable -- 开始事务 begin tran -- 读取id的值. declare @x int select @x=id from chp845(xlock) where id=1 ------------------------------ --连线2中执行查询 select * from chp845 where id=1 --> 等待.. ------------------------------ -- 修改id的值. update chp845 set id=id+10 where id=1 ------------------------------ --连线2中再执行查询 select * from chp845 where id=1 --> 再等待.. ------------------------------ -- 提交事务 commit tran ------------------------------ --连线2中再执行查询 select * from chp845 -- 结果 id de ----------- ----- 11 aa 2 bb ------------------------------
------解决方案--------------------
begin tran update t_tableinfo with(uplock,readpast) commit tran
------解决方案--------------------
想深入了解可用SQL Profiler工具.