首先我看书,书上是这么说的,对于一个资源当两个进程同时设置了共享锁,然后都准备修改数据变成排他锁,由于排他锁和共享锁互斥,所以必须等到其另一个进程的共享锁释放才可以设置排他锁,但是在可重复读级别下,共享锁会一直保留到事物结束,所以两个进程都不释放共享锁,也就都不能设置排他锁,所以引起死锁, 
    然后书上说更新锁可以解决这种问题,但是后边又说更新锁跟排他锁也会互斥,我就想不通既然更新锁跟排它锁也互斥,
    那么假设进程A和B同时又共享锁,进程A先把共享锁变成更新锁,然后打算变成排他锁,但是这时候进程B并没有释放共享锁,进程A的更新锁也不能变成排他锁,会一直等待B结束;;;
回头看进程B,进程B准备把共享锁变成排它锁,由于进程A存在更新锁,跟排它锁互斥,所以进程B也不能设置排它锁,这一依然是2个进程互相等待。
   上面的例子是我的理解,我不知道这样理解对不对,如果对的话,更新锁也不能解决死锁啊
问题2  意向锁和普通的(共享锁,排它锁)互斥吗,表锁,页锁,行锁之间是否互斥
   

解决方案 »

  1.   

    1,它并没有S->U->X,而是直接U->X。
    2,MSDN ONLINE HELP
      

  2.   


    CREATE TABLE [dbo].[TB](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [A] [nchar](10) NULL,
    [B] [nchar](10) NULL,
    [C] [nchar](10) NULL,
     CONSTRAINT [PK_TB] PRIMARY KEY CLUSTERED 
    (
    [ID] ASC
    ) ON [PRIMARY]
    )
    GO
    CREATE NONCLUSTERED INDEX [NonClusteredIndex-20130630-103739] ON [dbo].[TB]
    (
    [A] ASC
    )
    GO
    INSERT INTO [dbo].[TB] VALUES('A','B','')
    INSERT INTO [dbo].[TB] VALUES('A','B','')
    INSERT INTO [dbo].[TB] VALUES('A','B1','')
    INSERT INTO [dbo].[TB] VALUES('A','B1','')
    GO然后打开SQL Profiler ,然后选择 lock:acquired , lock:released 事件,
    运行 
    BEGIN TRAN
    UPDATE [dbo].[TB] SET [C]='X' WHERE [A]='A' AND [B]='B1'
    ,再去查看SQL Profiler结果,
    注意观察你上图的LOCK获取的类型跟次序,你现在明白“1,它并没有S->U->X,而是直接U->X”了吗?