2016-04-13 1 views
0

同じオブジェクトで修正と更新を行うために複数のスレッドを実行しています!データの上書きを避ける方法(紛失)書き込み - Cassandraの複数のスレッドが同じオブジェクトを更新する

のは、それをシンプルに保つみましょう:

私はOBJ1を持っています| id |カウンター|タイムスタンプ| :)カウンターを行うには

実行()3スレッドT1、T2はT3 ++

カサンドラでI'am新しい自分の経験からそう、どのように私は私の更新や魔女のソリューションを行うためのオブジェクトをロックすることができますあなたは私のためにお勧めそのような状況でデータを上書きするのを避けるために使用する!

+0

テーブルの** CREATE TABLE **スクリプトを投稿できますか? – doanduyhai

+0

シンプルなレプリケーション戦略ファクタ1のサンプルテーブルです – Housekl

答えて

0

ロックはありません。同じオブジェクトを変異させる代わりに、調整のために突然変異のログを書きます。 CRDTまたはイベントソーシングを検索し、シナリオに応じて少し違った方法で実装することができます。

また、軽量トランザクションを使用して、突然変異が機能するまで再試行できますが、スループットは非常に悪くなります。

UPDATE purchases SET balance=-200 WHERE user='user1' IF balance=-208; 

新しいIF/balance句で再試行できない場合は、同時実行性/スループットの要件によっては十分です。

言い換えれば、カウンタータイプがあります: https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html 場合によっては、あなたの特定のケースを増分または減分するだけです。

+0

Chrisに感謝しますが、私は調整のための突然変異のログについて最初の部分を得ていませんでした。私は軽量トランザクションを試みたが、私のために働いていない、カウンターはちょうどユースケースです、それは型カウンターではありません、私はオブジェクトフォームのDBを取得するソリューションがある+私の操作を行い、それが変更されているかどうか、コミットしたことに基づいてタイムスタンプをリアルタイムでチェックしますか? – Housekl

+0

"私にとってはうまくいかない"?しかし、ええ、タイムスタンプ** uuid **はあなたの最後の読み取りから修正されたかどうかをチェックするように働くでしょう(タイムスタンプを使うだけで同じmsで衝突することがあります)。しかし、それは非常に遅くなります。 [CRDT](https://hal.inria.fr/file/index/docid/445975/filename/icdcs09-treedoc.pdf)と[event sourcing](http://martinfowler.com/eaaDev/EventSourcing.html)並行性の競合を回避しながら、書き込み速度が非常に速い方法です。また、OT、CQRS、ウサギの穴のようなものとも呼ばれますが、似たような目標を持っています。あなたがこのエッセイのためにいくつかの解決策を見つけたら、私はそれらをチェックし、あなたに戻ってくるリンクのためにありがとうございます/グーグル –

+0

グーグルで時間を過ごすことをお勧めします!あなたのコメント提案は歓迎します – Housekl

関連する問題