完全的同意,比如下面这个数据表,里面包含超过3百万的数据。我对非索引列进行更新会产生Page级别的更新锁,但是表级别就是排它锁。很无奈,自己是想看看什么情况下出现UIX。 CREATE TABLE [dbo].[bigtable]( [col1] [int] NOT NULL, [col2] [varchar](50) NOT NULL, [keycol] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRAN UPDATE bigtable SET col1 = 0 WHERE col2 = 'B';--Monitoring the locks -- STEP2: Monitoring the sys.dm_tran_locks view by using %%lockres%% SELECT resource_description, resource_type, resource_associated_entity_id, request_mode FROM sys.dm_tran_locks WHERE request_session_id = @@SPID resource_type request_mode DATABASE S OBJECT X PAGE U
我要的是更新意向锁,应该不是共享吧。
不知有无方法可驻留UIX状态.
兄弟说得没错。我一直没有办法给数据表加上Update锁,所以就没法升级成UIX。
CREATE TABLE [dbo].[bigtable](
[col1] [int] NOT NULL,
[col2] [varchar](50) NOT NULL,
[keycol] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
UPDATE bigtable SET col1 = 0 WHERE col2 = 'B';--Monitoring the locks
-- STEP2: Monitoring the sys.dm_tran_locks view by using %%lockres%%
SELECT resource_description, resource_type, resource_associated_entity_id, request_mode
FROM sys.dm_tran_locks WHERE request_session_id = @@SPID
resource_type request_mode
DATABASE S
OBJECT X
PAGE U
两个事务只有一个能获得U锁,另一个只能release S锁,于是另一个事务获得的U升级为X。这两个操作都不能够被事务级的操作阻塞住吧。
好奇lz想看U锁的目的是什么。
其实我的目的很简单,既然SQLServer提供UIX锁,我就是想测试一下如何能够产生UIX。