非唯一聚簇索引和数据库死锁

时间:2014-04-07 07:14:39

标签: sql-server deadlock clustered-index database-deadlocks

我有一个表,比如Administration,它有ObjectID,CustomerName,VisitDate,PlannedDateTime,TypeOfTransaction列,我在PlannedDateTime列上有一个非唯一的聚簇索引。

对于每个PlannedDateTime值,我们有很多行,比如PlannedDateTime列的每个值最少20个重复值。当过程尝试更新VisitDate和TypeOfTransaction列时,我遇到了死锁问题。

虽然我知道SQL Server添加了uniquifier列以为PlannedDateTime的每个重复值带来唯一性,但我想了解当表上有更新时锁定如何对行进行处理。它是否使用相同的PlannedDateTime值锁定所有行,或者只锁定要考虑uniquifier的更新的单行?

表中的数据很大,比如1000多万条记录。

请分享您的想法...

1 个答案:

答案 0 :(得分:0)

SQL Server锁定是动态的。它将默认为行级锁定,但也可以升级到表或分区级别。

使用UPDATE,SQL Server使用更新和独占锁的混合。搜索要更新的行时使用更新锁,一旦找到行,它们就会转换为独占锁。独家锁定一直持续到交易结束。

要找出会话实际上有哪些帮助,请启动事务,执行更新,然后检查sys.dm_tran_locks以查找相关的request_session_id。

要调试死锁,请使用跟踪标志1222设置重新启动服务。这是解决死锁的一个很好的介绍:

http://technet.microsoft.com/en-us/library/ms178104%28v=sql.105%29.aspx