2

私は最近、アプリケーションでいくつかのデッドロック状況に取り組んでおり、私には奇妙に思える新しいケースがあります。エラーログにはこれが表示されます(現時点では問題にならない実行スタックはありません)。

deadlock-list
  deadlock victim=process84db88
   process-list
    process id=process84db88 taskpriority=0 logused=0 waitresource=KEY: 11:72057594409844736 (8194443284a0) waittime=4685 ownerId=3632385974 transactionname=SELECT lasttranstarted=2011-12-07T16:21:16.287 XDES=0x32f68fca0 lockMode=S schedulerid=6 kpid=6392 status=suspended spid=93 sbid=0 ecid=0 priority=0 trancount=0 lastbatchstarted=2011-12-07T16:21:16.287 lastbatchcompleted=2011-12-07T16:21:16.287 clientapp=.Net SqlClient Data Provider hostname=DE-1809 hostpid=4156 loginname=XXX isolationlevel=read committed (2) xactid=3632385974 currentdb=11 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
     executionStack
      ........   
    process id=process47bdc8 taskpriority=0 logused=240604 waitresource=KEY: 11:72057594409844736 (829df5d1e88e) waittime=4681 ownerId=3632397262 transactionname=UPDATE lasttranstarted=2011-12-07T16:21:26.100 XDES=0x2f00b93c0 lockMode=X schedulerid=1 kpid=6568 status=suspended spid=88 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2011-12-07T16:21:25.640 lastbatchcompleted=2011-12-07T16:21:25.640 clientapp=.Net SqlClient Data Provider hostname=DE-1809 hostpid=4156 loginname=XXX isolationlevel=read committed (2) xactid=3632397262 currentdb=11 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128056
     executionStack
      .........  
   resource-list
    keylock hobtid=72057594409844736 dbid=11 objectname=dbo.OurTable indexname=PK_OurTable id=lock1d9aa0b00 mode=X associatedObjectId=72057594409844736
     owner-list
      owner id=process47bdc8 mode=X
     waiter-list
      waiter id=process84db88 mode=S requestType=wait
    keylock hobtid=72057594409844736 dbid=11 objectname=dbo.OurTable indexname=PK_OurTable id=lock1a56cb580 mode=U associatedObjectId=72057594409844736
     owner-list
      owner id=process84db88 mode=S
     waiter-list
      waiter id=process47bdc8 mode=X requestType=convert

テーブルの1つにある同じクラスター化インデックスのキーでロックが発生しています。私を少し混乱させるのは、リソースリストの最後のキーロック行のモードです。

対応するowner-listの所有者がmode=Sであるのに対し、 mode=Uと表示されます。

これはどのように読むべきですか?これらの2つのモードは通常同じです。これらのモードはどのように異なりますか?

4

2 に答える 2

3

process47bdc8私はそれを、そのリソースにロックがあり、Uそれをロックに変換するのを待っているが、すでにロックされているXのでできないことを意味すると解釈します。process84db88S

SロックとUロックは互換性があります。

于 2011-12-09T11:20:02.583 に答える
1

MSDNからのこの引用は説明を提供するかもしれません:

この潜在的なデッドロックの問題を回避するために、更新 (U) ロックが使用されます。リソースに対する更新 (U) ロックを取得できるのは、一度に 1 つのトランザクションだけです。トランザクションがリソースを変更する場合、更新 (U) ロックは排他 (X) ロックに変換されます。それ以外の場合、ロックは共有モード ロックに変換されます。

したがって、共有ロックを要求する 1 つのトランザクション (おそらく最初のトランザクション) は、代わりに更新ロックを保持することになります。更新ロックは、トランザクションが更新を行いたい場合に排他ロックに変換するオプションをトランザクションに与えるだけです。

このメカニズムは、2 つのトランザクションが同じ行を読み取ってから書き込む場合に役立ちます。あなたの場合、2 つの行がプレイされています。最初のトランザクションは行 A に排他ロックがあり、行 B の排他ロックに変換するのを待っています。2 番目のトランザクションは行 B に共有ロックがあります。 A.

于 2011-12-09T08:05:32.513 に答える