sql-server – SQL Server – 两个进程如何专门(X)锁定相同的页面?

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server – 两个进程如何专门(X)锁定相同的页面?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我正确地解密了以下死锁图,它看起来像两个进程(SPID:216和209)在同一页上拥有独占(X)锁:

XDL<资源列表>节目

  1. <pagelock
  2. fileid="1"
  3. pageid="17410848"
  4. dbid="21"
  5. subresource="FULL"
  6. objectname="33bd93e0-f5b2-43f6-93ca-56bbe6493e0c.dbo.sync_publishers2"
  7. id="lock630b1d5380"
  8. mode="X"
  9. associatedObjectId="72057608416264192">
  10. <owner-list>
  11. <owner
  12. id="process90763f08c8"
  13. mode="X"
  14. requestType="wait" />
  15. </owner-list>
  16. <waiter-list>
  17. <waiter
  18. id="process861129bc28"
  19. mode="X"
  20. requestType="wait" />
  21. </waiter-list>
  22. </pagelock>

还有一点点

  1. <pagelock
  2. fileid="1"
  3. pageid="17410848"
  4. dbid="21"
  5. subresource="FULL"
  6. objectname="33bd93e0-f5b2-43f6-93ca-56bbe6493e0c.dbo.sync_publishers2"
  7. id="lock630b1d5380"
  8. mode="X"
  9. associatedObjectId="72057608416264192">
  10. <owner-list>
  11. <owner
  12. id="process90763f04e8"
  13. mode="X" />
  14. </owner-list>
  15. <waiter-list>
  16. <waiter
  17. id="process90763f08c8"
  18. mode="X"
  19. requestType="wait" />
  20. </waiter-list>
  21. </pagelock>

怎么可能,这是什么意思?

完整的死锁定义如下:http://pastebin.com/A4Te3Chx.

UPD:我已经在Microsoft Connect上提交了一个项目来尝试收集权威回应:https://connect.microsoft.com/SQLServer/Feedback/Details/3119334.

解决方法

这只是意味着有一个等待该锁的队列.

您可以使用以下命令重新生成(运行setup,然后是tran 1.然后,您可以在15秒内按顺序在不同的连接中启动tran 2和tran 3).

建立

  1. USE tempdb
  2.  
  3. CREATE TABLE T
  4. (
  5. X INT PRIMARY KEY WITH(ALLOW_ROW_LOCKS = OFF),Filler AS CAST('A' AS CHAR(8000)) PERSISTED
  6. );
  7.  
  8. INSERT INTO T VALUES (1),(2),(3);

特兰1

  1. SET XACT_ABORT ON
  2. USE tempdb -- t1
  3.  
  4. BEGIN TRAN
  5.  
  6. UPDATE T SET X = X WHERE X = 1
  7.  
  8. WAITFOR DELAY '00:00:15'
  9.  
  10.  
  11. --See what locks are granted just before the deadlock
  12. SELECT resource_description,request_status,request_session_id,X
  13. FROM sys.dm_tran_locks tl
  14. LEFT JOIN T WITH(NOLOCK)
  15. ON sys.fn_PhysLocFormatter(T.%% physloc%%) = '(' + RTRIM(resource_description) + ':0)'
  16. WHERE resource_associated_entity_id = (SELECT partition_id
  17. FROM sys.partitions
  18. WHERE object_id = object_id('T'));
  19.  
  20. RAISERROR ('',1) WITH NOWAIT;
  21.  
  22. UPDATE T SET X = X WHERE X = 3
  23.  
  24. WAITFOR DELAY '00:00:20'
  25. ROLLBACK

特兰2

  1. SET XACT_ABORT ON
  2. USE tempdb -- t2
  3.  
  4. BEGIN TRAN
  5.  
  6. UPDATE T SET X = X WHERE X = 2
  7.  
  8. UPDATE T SET X = X WHERE X = 1
  9.  
  10. WAITFOR DELAY '00:00:20'
  11. ROLLBACK

特兰3

  1. SET XACT_ABORT ON
  2.  
  3. USE tempdb -- t3
  4. BEGIN TRAN
  5.  
  6. UPDATE T SET X = X WHERE X = 3
  7.  
  8. UPDATE T SET X = X WHERE X = 1
  9.  
  10. ROLLBACK

在请求锁定之前立即对tran_locks进行查询的结果将会导致死锁

  1. +----------------------+----------------+--------------------+---+
  2. | resource_description | request_status | request_session_id | X |
  3. +----------------------+----------------+--------------------+---+
  4. | 4:416 | GRANT | 61 | 1 |
  5. | 4:416 | WAIT | 64 | 1 |
  6. | 4:416 | WAIT | 65 | 1 |
  7. | 4:418 | GRANT | 64 | 2 |
  8. | 4:419 | GRANT | 65 | 3 |
  9. +----------------------+----------------+--------------------+---+

我收到的死锁图如下.

虽然它说死锁的受害者正在等待tran 2拥有的锁,但实际上并不是这样.在僵局的时候,锁由tran 1拥有,而tran 2在第3轮之前首先排在第一位.

死锁图XML显示了这一点,因为它具有相同资源的两个节点(第416页),而“所有者”中有一个requestType =“等待”

  1. <resource-list>
  2. <pagelock
  3. fileid="4"
  4. pageid="416"
  5. dbid="2"
  6. subresource="FULL"
  7. objectname="tempdb.dbo.T"
  8. id="lock2486d8c4380"
  9. mode="X"
  10. associatedObjectId="936748728230805504">
  11. <owner-list>
  12. <owner
  13. id="process2486ba0cca8"
  14. mode="X"
  15. requestType="wait" />
  16. </owner-list>
  17. <waiter-list>
  18. <waiter
  19. id="process2485370c8c8"
  20. mode="X"
  21. requestType="wait" />
  22. </waiter-list>
  23. </pagelock>
  24. <pagelock
  25. fileid="4"
  26. pageid="416"
  27. dbid="2"
  28. subresource="FULL"
  29. objectname="tempdb.dbo.T"
  30. id="lock2486d8c4380"
  31. mode="X"
  32. associatedObjectId="936748728230805504">
  33. <owner-list>
  34. <owner
  35. id="process2485370c4e8"
  36. mode="X" />
  37. </owner-list>
  38. <waiter-list>
  39. <waiter
  40. id="process2486ba0cca8"
  41. mode="X"
  42. requestType="wait" />
  43. </waiter-list>
  44. </pagelock>
  45. <pagelock
  46. fileid="4"
  47. pageid="419"
  48. dbid="2"
  49. subresource="FULL"
  50. objectname="tempdb.dbo.T"
  51. id="lock248636ace80"
  52. mode="X"
  53. associatedObjectId="936748728230805504">
  54. <owner-list>
  55. <owner
  56. id="process2485370c8c8"
  57. mode="X" />
  58. </owner-list>
  59. <waiter-list>
  60. <waiter
  61. id="process2485370c4e8"
  62. mode="X"
  63. requestType="wait" />
  64. </waiter-list>
  65. </pagelock>
  66. </resource-list>

猜你在找的MsSQL相关文章