Update语句的锁定模式是键锁还是表锁?
从联机文档上看到如果对于一个表作Update的话,Sql server会自动选择一个最优锁定策略,但是在实际应用当中,系统出现的一些问题感觉有点疑惑,于是做了个实验:
环境:Win2K Server + SQL Server SE SP3
数据库使用SQL Server安装时候带的example数据库:Northwind
进程A:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
BEGIN TRANSACTION
update customers set CompanyName = 'compTest1' where customerID = 'ALFKI'
waitfor delay '00:00:10' --等待10秒模拟实际系统中系统繁忙时提交事务时间长
update employees set LastName = 'empTest1' where employeeID = '1'
COMMIT TRANSACTION
进程B
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
BEGIN TRANSACTION
update employees set LastName = 'empTest1' where employeeID = '1'
waitfor delay '00:00:10'
update customers set CompanyName = 'compTest1' where customerID = 'ALFKI'
COMMIT TRANSACTION
如果按照联机文档中所说话,Sql Server会自动选择键锁,这样就不会出现死锁的情况。但是实际同时运行A,B进程,却出现了死锁,牺牲了一个进程。
我对于Sql Server的事务/锁定机制不是很了解,不知道是否我的理解、测试有误,请大家解释一下这个现象。谢谢!