DMSにおける同時実行違反の問題について


解説

Sitecore DMSを有効にしたSitecoreのWebサイトでは、データベースの同時実行違反エラーがスローされる可能性があります。

Sitecoreログ ファイルに出力される以下のエントリーは、同時実行違反エラーの一般的な症状です:

ERROR Error committing data row Visits.[GUID] : Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
ERROR Error committing data row Pages.[GUID] : Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
ERROR Error committing data row [TableName].[GUID]: Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.

Sitecore DMSで同時実行違反エラーが発生する原因となるシナリオは複数である可能性があります。

この記事では、このようなエラーが発生する既知のシナリオ、原因および推奨の解決策について説明します。

シナリオ1

構成

解説

DMSは、アクティブな訪問のデータをSessionストレージに保持します。InProcセッション状態を有効にすると、各Sitecoreソリューションが独自のSessionデータを保持するため、独自のDMS訪問データを保持することになります。これにり、一部の分析データが矛盾した形で分析データベースに送信され、同時実行違反エラーが表示される可能性があります。

解決策1

すべてのContent Deliveryインスタンスで、セッション状態のモードをSQLServer、State Serverまたはその他の共有されたアウトプロセス セッション状態に変更してください。

解決策2

すべてのContent Deliveryインスタンスのロード バランサーでスティッキー セッション戦略が使用されていることを確認してください。一部のロード バランサーではユーザー セッションの持続性が100%保証されないため、この構成でも、このエラーが随時発生することがあることに注意してください。

シナリオ2

構成
解説

DMSは、各要求の終了時に、訪問者のデータ変更を永続データ ストレージに直接フラッシュしません。
その代わりに、訪問者のデータは中間ストレージに保存され、非同期でコミットされます。分析データを保持するストレージは2種類あります:

異なるサーバーのDataQueueストレージ間でデータの非同期化が発生した場合、矛盾した保存コマンドが生成され、同時実行違反が発生する可能性があります。

解決策

Sitecoreログ ファイルを確認してください。特定のGUIDに対して同時実行違反が1度しか出力されていない場合、無視しても問題ありません。
これは、Sitecoreは他のサーバーからのDataQueueを処理することで、自動的に競合を解決することができたということです。

同時実行違反が繰り返して発生したGUIDについては、シナリオ4を参照してください。

シナリオ3

構成

解説

DMSは、トラフィックの負荷が異常に高い場合、特定の分析データをドロップするように設計されています。この機能は、負荷のピーク時にシステムに障害が発生することを防止します。分析データがドロップされると、一部の分析データの更新に一貫性がなくなり、同時実行違反エラーが発生し、DMSデータベースに完全に書き込まれなくなる場合があります。

解決策

システムの水平スケーリングが推奨されます。このために、Content Deliveryサーバーの数またはパフォーマンスを向上させる必要があります。
Sitecoreサイトのスケーリングの詳細については、以下の記事を参照してください:
http://sdn.sitecore.net/Reference/Sitecore%207/Scaling%20Guide.aspx

シナリオ4

現象

Sitecoreログ ファイルに、同一のGUIDを持つ同時実行違反エラーが多数あります。

例えば:

ManagedPoolThread #2 09:10:04 ERROR Error committing data row Visitors.71363913-344d-424b-adf7-8a1fa27f6ec6 : Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
...
ManagedPoolThread #11 09:20:05 ERROR Error committing data row Visitors.71363913-344d-424b-adf7-8a1fa27f6ec6 : Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
解決策

この解決策は、同時実行違反エラーの原因を排除するのではなく、代わりに回復操作を実行します。同時実行違反が発生した場合、パッチはUPDATE操作の代わりに、INSERT操作を実行しようとします。
この解決策を適用するには、以下の手順に従ってください:

1. 添付のSitecore.Support.406447.configファイルをWebサイトの/App_Config/Includeフォルダにコピーします。

2. 添付のSitecore.Support.406447.dllアセンブリをWebサイトの/binフォルダにコピーします。