关于更新锁的以及意向锁的问题
首先我看书,书上是这么说的,对于一个资源当两个进程同时设置了共享锁,然后都准备修改数据变成排他锁,由于排他锁和共享锁互斥,所以必须等到其另一个进程的共享锁释放才可以设置排他锁,但是在可重复读级别下,共享锁会一直保留到事物结束,所以两个进程都不释放共享锁,也就都不能设置排他锁,所以引起死锁,
然后书上说更新锁可以解决这种问题,但是后边又说更新锁跟排他锁也会互斥,我就想不通既然更新锁跟排它锁也互斥,
那么假设进程A和B同时又共享锁,进程A先把共享锁变成更新锁,然后打算变成排他锁,但是这时候进程B并没有释放共享锁,进程A的更新锁也不能变成排他锁,会一直等待B结束;;;
回头看进程B,进程B准备把共享锁变成排它锁,由于进程A存在更新锁,跟排它锁互斥,所以进程B也不能设置排它锁,这一依然是2个进程互相等待。
上面的例子是我的理解,我不知道这样理解对不对,如果对的话,更新锁也不能解决死锁啊
问题2 意向锁和普通的(共享锁,排它锁)互斥吗,表锁,页锁,行锁之间是否互斥
------解决方案--------------------
看来版主对于的死锁的概念 有所欠缺啊,
死锁:两个进程相互永久性阻塞 就会产生死锁。
我们可以通过以下方式去避免死锁:
(1)尽量使事务简短
(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”了吗?