書き込みロックがダウングレードされると、現在書き込みロックを取得しているスレッドは、書き込みロックを保持し、次に読み取りロックを取得し、その後書き込みロックを解放する必要があります。
では、なぜ書き込みロックを保持する必要があるのでしょうか? ?
上の図では、「現在のスレッドはスレッド T のデータ更新を感知できない」と説明されていますが、これをどう理解すればよいでしょうか。スレッド T が書き込みロックを取得してからデータを更新した場合、現在のスレッドは書き込みロックが解放されるまでデータの更新を認識できません。これは問題ありませんが、スレッド T が書き込みロックを解放すると、現在のスレッドはデータの更新を認識できません。データの更新 ここは理解して問題ないですよね?
説明を手伝ってください、thx
これはロックのダウングレードについて説明しています。まず、書き込みロックは排他的であり、読み取りロックは共有され、次に読み取りロックと書き込みロックはスレッド間で相互に排他的です。ロックのダウングレードの前提は、すべてのスレッドがデータに敏感であることです。変更されますが、書き込みのためロックが 1 つしかないため、デグレードが発生します。
最初に書き込みロックを解放してから読み取りロックを取得すると、他のスレッドが書き込みロックを取得する前に取得する可能性があり、読み取りロックの取得がブロックされ、データの変更を検出できなくなります。したがって、最初に書き込みロックを保持してデータが変更されないことを確認し、読み取りロックを取得してから書き込みロックを解放する必要があります。
書き込みロックは他のプロセスからの読み取りおよび書き込み操作を許可しませんが、読み取りロックは読み取り操作を許可します。
キャプチャした例に基づくと、書き込みロックを解放すると、T プロセスが書き込みロックを取得します。この時点では、読み取りロックを取得できないため、最初に読み取りロックを取得してから書き込みロックを解放する必要があります。
まず、あなたは読み取り/書き込みロックの意味を理解していません。読み取りロックの存在は、他の書き込み操作が許可されていないことを意味します。
あなたが提供した例によると、その操作が他のスレッドによって中断されることを望まないトランザクション スレッドが存在する可能性があり、このトランザクション操作は、異なるデータ (またはテーブル) を更新するために複数の部分に分割されたり、非常に時間がかかる場合があります。 -消費する。書き込みロックが長期間排他的に使用される場合、一部の高応答アプリケーションでは明らかに許可されないため、一部の書き込み操作が完了した後、読み取りロックを使用してダウングレードし、他のプロセスの読み取り操作に応答できるようにします。ロックは、すべてのトランザクションが完了した場合にのみ解放されます。
ご理解のとおり、書き込みロックが他のスレッドによって占有されている場合、トランザクション スレッドは中断して、他の書き込みロックが解放されるまで待機する必要があります。
「その場合、現在のスレッドはスレッド T のデータ更新を認識できません」
T1 がデータを読み取ると、データ値は現在のスレッドのコンテキストにコピーされるため、他のスレッドはデータが更新されたかどうかを感知する方法がありません。データがメモリ、つまりヒープに送信されている限り、他のスレッドは最新の値を取得できます。