2016-10-03 6 views
0

特定の期間に配信をスケジュールするアルゴリズム/ヒューリスティックを作成しようとしていますが、競合する予定のアイテムが2つあります書き込みは本当に原子的ではないので、DBに書き込まれます。複雑な条件でDBにモデルを挿入するための競合条件の回避

真に競合状態を防止する唯一の方法は、アトミックな挿入操作TMKを作成することです。

サーバーは一定期間のスケジュールを設定する要求を受け取り、サーバーにはデータをDBに書き込む前にその期間がまだ有効かどうかを確認する必要があります。しかし、その時点でサーバは同様の要求を得て、矛盾するデータを書き込むことになります。

これを回避するにはどうすればよいですか?全体を原子的にするために書き込み操作にフックするDB自体にいくつかのスクリプトを作成する方法はありますか?そのスクリプトにロック機構を置くことによって?全体を非アトミックにするのは、サーバーとDBの間の読み取り時間と配線時間です。

+2

特定のコードを作成するのに問題があるようです。その場合、[問題を再現する最小限のコード](http://stackoverflow.com/help/mcve)を投稿すると、より役立ちます。 –

+1

この質問はプログラマに属している可能性があります。 –

答えて

2

私が競合状態に陥るときはいつでも、ただちに解決策があると思います。

手順1)データベースに直接データを追加するのではなく、何もチェックせずにキューに追加することができます。

ステップ2)別のリーダーがキューチェックDBから競合がないかどうかを確認し、必要な処置を行います。

これはこれを解決する方法の1つです。より良いソリューションを実装する場合は、共有してください。

希望すること

+0

答えをありがとう、私は実際にどのようにこれが問題を解決するのか分かりません。 (1)同じ待ち行列にいる2人の労働者が短時間で同様の要求を得ることができた。(2)両方の労働者がDBからの読書を行い、書類がうまくいたことを確認した。効果的に高水準のデータ衝突を引き起こします。 –

+0

上記を回避する唯一の方法は、書き込み自体(3)がDBのアトミック操作である場合です。問題は、私たちのDBの書き込みはアトミックではない、それはDB内の単一のフィールドだけではなく、より多くの条件に依存します。 –

+0

キューがどのように問題を解決するかをより正確に記述できますか?ありがとう! –

関連する問題