ContactLockExceptionエラーは、Sitecore XPの連絡先をロックする際に発生する可能性のある例外です。
Sitecore XPでは、ウェブ クラスタやアウト オブ リクエスト ワーカーが連絡先をロックできます。連絡先データの変更は、ロックのオーナーしか実施できません。ロックは、複数のスレッドが連絡先のデータを同時に変更しようとした際に発生するデータ破損を回避するために導入されました。
※註:Sitecore XP 9.0以降のバージョンでは、連絡先はロックされなくなったため、ContactLockExceptionエラーは発生しなくなりました。
ロックにはタイムアウト設定があります。ウェブ クラスタが連絡先をロックした場合、その連絡先がウェブサイト上でアクティブになっている間は、ウェブ クラスタが時々ロックを延長する必要があります。このロックは、ウェブサイトでの連絡先のセッション終了時に、連絡先がデータベースに保存されるまで残ります。
ContactLockExceptionエラーが発生する可能性のあるシナリオは、以下の通りです:
- 外部セッションが初期化され(initializeExternalSessionパイプラインを参照)、連絡先がすでにロックされているため、連絡先のロックを取得することができない場合。外部セッションは、通常、オフラインのインタラクションをシステムにインポートするためにSitecore.Analytics.Tracking.External.InteractionRegistryクラスを使用した場合に初期化されます。
- 連絡先を識別するためにTracker.Current.Session.Identifyメソッドが呼び出され、識別子によって見つかった既存の連絡先が、アウト オブ リクエスト ワーカーがすでにロックを保持しているため、ロックできない場合。連絡先がすでにウェブ クラスタによってロックされている場合、セッションはそのウェブ クラスタにリダイレクトされ、例外はスローされません。
- 連絡先をIDで読み込むためにSitecore.Analytics.Tracking.ContactManager.TryLoadContactメソッドが呼び出され、読み込んだ連絡先がすでにウェブ クラスタでロックされているが、ウェブ クラスタ名が空白になっていた場合。TryLoadContactメソッドは、通常、ページへのリクエストが作成され、トラッキングが有効化されている場合に呼び出されます。
- 連絡先のリースを延長したが成功に至らなかった場合。上述したように、ロックには有効期限があるため、ロックの有効期限が切れるかどうかを定期的にチェックする必要があります。有効期限が切れそうになった場合、xDBでロックを延長する必要があります。このような定期的なチェックは、endAnalyticsパイプラインに実装されており、トラッキングが有効になっている場合、全てのHTTPリクエストの最後に呼び出されるようになっています。
- 連絡先からPIIの機密データを削除しようとしたが、連絡先がすでにロックされているため連絡先のロックを取得することができなかった場合。これは、Sitecore XP 8.2 Update-7以降のバージョンのみ該当します。
これらの例外を回避するには、以下の2つの解決策を推奨いたします。
- (例えば、Tracker.Current.Session.Identifyメソッドの呼び出しなどで)失敗した操作を再試行してください。呼び出しは、連絡先がロックされているため、当初失敗する恐れがありますが、その間にロックが解除されれば、再試行が成功する可能性があります。
- ワーカーにより連絡先がロックされたままの時間を最小にするために、アウト オブ プロセス ワーカーのロック タイムアウト時間を減らしてください。