2013-03-14 156 views
2

我有一个约350万行的表。锁分区[1]在数据库上启用。该表在白天获得大量插入,并且在锁分区上遇到很多死锁。这些类型的死锁很好地描述在http://sqlindian.com/2012/07/07/deadlocks-involving-lock-partitions/,但作者说这些类型的死锁是非常罕见的。在我们的情况下,他们似乎并不稀罕!锁分区死锁

我可以通过跟踪标志1229禁用锁分区,但不建议这样做。有没有人有关于如何避免这些类型的僵局的建议,或者我如何能够进一步分析这种情况,以了解为什么我们会遇到如此多的这种“罕见”类型的死锁?

[1] http://msdn.microsoft.com/en-us/library/ms187504(v=sql.105).aspx

UPDATE:添加例如死锁图形

<deadlock> 
    <victim-list> 
    <victimProcess id="process5004748" /> 
    </victim-list> 
    <process-list> 
    <process id="process5004748" taskpriority="0" logused="0" waitresource="OBJECT: 5:1423344135:0 " waittime="3008" ownerId="2379819613" transactionname="user_transaction" lasttranstarted="2013-03-14T09:28:55.803" XDES="0x77ab8f950" lockMode="X" schedulerid="11" kpid="5416" status="suspended" spid="507" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-03-14T09:28:55.817" lastbatchcompleted="2013-03-14T09:28:55.807" clientapp=".Net SqlClient Data Provider" hostname="ExampleHost" hostpid="8664" loginname="ExampleUser" isolationlevel="read uncommitted (1)" xactid="2379819613" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
     <executionStack> 
     <frame procname="" line="1" stmtstart="616" stmtend="1504" sqlhandle="0x020000002468011b993c824e2e0ce3fd2783a30e8e591641" /> 
     <frame procname="" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000" /> 
     </executionStack> 
     <inputbuf> 
(@p0 datetime,@p1 bigint ...) INSERT INTO tblExample (Column1, Column2, ...); select SCOPE_IDENTITY() 
     </inputbuf> 
    </process> 
    <process id="processd4a988" taskpriority="0" logused="0" waitresource="OBJECT: 5:1423344135:10 " waittime="3008" ownerId="2379819595" transactionname="user_transaction" lasttranstarted="2013-03-14T09:28:55.663" XDES="0x2fe4323b0" lockMode="X" schedulerid="2" kpid="6756" status="suspended" spid="473" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-03-14T09:28:55.677" lastbatchcompleted="2013-03-14T09:28:55.667" clientapp=".Net SqlClient Data Provider" hostname="ExampleHost" hostpid="8664" loginname="ExampleUser" isolationlevel="read uncommitted (1)" xactid="2379819595" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
     <executionStack> 
     <frame procname="" line="1" stmtstart="616" stmtend="1504" sqlhandle="0x020000002468011b993c824e2e0ce3fd2783a30e8e591641" /> 
     <frame procname="" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000" /> 
     </executionStack> 
     <inputbuf> 
     (@p0 datetime,@p1 bigint ...) INSERT INTO tblExample (Column1, Column2, ...); select SCOPE_IDENTITY() 
     </process> 
    </process-list> 
    <resource-list> 
    <objectlock lockPartition="0" objid="1423344135" subresource="FULL" dbid="5" objectname="" id="lock5d745ae00" mode="X" associatedObjectId="1423344135"> 
     <owner-list> 
     <owner id="processd4a988" mode="X" /> 
     </owner-list> 
     <waiter-list> 
     <waiter id="process5004748" mode="X" requestType="wait" /> 
     </waiter-list> 
    </objectlock> 
    <objectlock lockPartition="10" objid="1423344135" subresource="FULL" dbid="5" objectname="" id="lock55da8ea00" mode="IX" associatedObjectId="1423344135"> 
     <owner-list> 
     <owner id="process5004748" mode="IX" /> 
     </owner-list> 
     <waiter-list> 
     <waiter id="processd4a988" mode="X" requestType="wait" /> 
     </waiter-list> 
    </objectlock> 
    </resource-list> 
</deadlock> 

更新2:将通过NHibernate的

begin transaction with isolation level: ReadUncommitted 

INSERT INTO tblExample 
      (Column1, 
      Column2, 
      Column2, 
      Column3, 
      Column4, 
      Column5, 
      Column6, 
      Column7, 
      Column8, 
      Column9, 
      Column10, 
      Column11, 
      Column12, 
      Column13, 
      Column14, 
      Column15, 
      Column16, 
      Column17, 
      Column18, 
      Column19, 
      Column20, 
      Column21) 
VALUES  ('2013-03-14T12:47:26.00' /* @p0 */, 
      NULL /* @p1 */, 
      75 /* @p2 */, 
      'Test Text with some characters' /* @p3 */, 
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22' /* @p4 */, 
      2130706433 /* @p5 */, 
      NULL /* @p6 */, 
      NULL /* @p7 */, 
      0 /* @p8 */, 
      'Test Title' /* @p9 */, 
      '11223344' /* @p10 */, 
      0 /* @p11 */, 
      '2013-03-14T12:47:26.00' /* @p12 */, 
      0 /* @p13 */, 
      '2013-03-14T12:47:26.00' /* @p14 */, 
      'en' /* @p15 */, 
      '2013-03-14T12:47:26.00' /* @p16 */, 
      0 /* @p17 */, 
      'SomeName' /* @p18 */, 
      NULL /* @p19 */, 
      917278 /* @p20 */, 
      2805683 /* @p21 */); 



select SCOPE_IDENTITY() 

commit transaction 

回答

2

Assumming尽职调查(即你做的调查产生的INSERT。正确),并让我们清楚说明我们正在谈论lock partitioning,而不是partition locking

不幸的是没有什么可以做的,但要确保你运行的是最新的SP和最新的CU。最好在最新的产品版本上。这方面有很多修复。 如果您为SP应用了最新的SP和最新的CU并且问题仍然存在,请联系产品支持。

我可以禁用跟踪标志1229锁定分区,但不推荐

多少个内核,你呢?你可以随时尝试和测试。

+0

是的,我一定在谈论锁分区。我们的死锁图符合引用文章中的所有标准,锁定对象的形式为OBJECT 5:2342545:23,有一个lockPartition =“n”,subresource =“FULL”等。我已经添加了一个示例死锁图原来的帖子,以防你可以从中得到一些额外的信息。 – 2013-03-14 11:08:41

+0

我可能会尝试禁用锁分区。 MSDN文章说它启用了16个CPU服务器。我猜有很多人的服务器核心少于16个,而且他们必须能够非常有效地运行,所以它不能被关闭,我猜... – 2013-03-14 11:11:15

+0

为什么你的INSERT需要'X '锁定对象? IX应该足够了。解决这个难题,你解决了你的问题。 – 2013-03-14 11:19:56

0

我们有类似的问题,经过适当的调查后,发现主要问题是一些没有启用row_lock和page_lock的情况下创建的索引。因此,任何插入,更新,删除操作都会在表级生成X锁。并发行动以僵局结束。

SELECT name indexname,allow_row_locks,allow_page_locks 
FROM sys.indexes 
WHERE 1=1 
--and object_id = object_id('tablename') 
AND allow_row_locks = 0 
AND allow_page_locks = 0