1.在一个查询窗口运行以下代码
BEGIN TRANSACTION;
GO
select * from SK_Product WITH(HOLDLOCK) where ProId=47;
WAITFOR DELAY '00:00:30';
select * from SK_Product where ProId=47;
GO
COMMIT TRANSACTION;
GO
select * from SK_Product WITH(HOLDLOCK) where ProId=47;
WAITFOR DELAY '00:00:30';
select * from SK_Product where ProId=47;
GO
COMMIT TRANSACTION;
UPDATE [Laptop].[dbo].[SK_Product]
SET [ProName] = [ProName]+ ' 12'
WHERE ProId=47
GO
select * from SK_Product where ProId=47;
SET [ProName] = [ProName]+ ' 12'
WHERE ProId=47
GO
select * from SK_Product where ProId=47;
观察结果 发现第一个窗口中的两条select显示的数据都是未修改前的数据,第二个窗口在等待第一个窗口中的代码执行完后才得以执行,第二个窗口中的select显示的是修改后的数据
这种方式时间上是限制并发,因为其独占性造成请求必须按先后顺序执行 ,效率比较低下。
3.两个锁定区别
SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
4.
执行 EXEC SP_LOCK 报告有关锁的信息
查询分析器中按Ctrl+2可以看到锁的信息
5.何锁一个表的某一行
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM table ROWLOCK WHERE id = 1