[groonga-dev,03242] Re: mroongaで同一レコードの登録、削除を繰り返すと値が抜ける事がある(解決)

Back to archive index

各務 洋 kagam****@outwa*****
2015年 5月 18日 (月) 18:02:32 JST


お世話になります、各務です。


>> 同一レコードの登録、削除を連続で繰り返すと、値が抜けた状態で保存される
>> のが見えましたのでお送りします。
> 
> これは仕様なんです。
> 
> Mroongaはデータストアはカラムストアタイプで、最小の更新操作
> はたとえば次のようなものです。
> 
>   * 1レコードの追加・削除(レコードのみ。カラムは別。)
>   * 1レコード内の1カラムの値の設定
> 
> つまり、「レコードを追加して全部のカラムの設定」は最小の更新
> 操作ではありません。
> 
> 最小の更新操作でないということは途中の状態が見えるということ
> です。

分かりやすい説明ありがとうございます!INSERT 時をざっくりまとめると、

Default 値でカラム毎のレコードを一気に作成し、
その後各カラム毎に値を update していく。
制約違反があれば全部消してエラーにする。

その処理の途中で SELECT すると、期待する値の入っていない
+---+---+--+---------------------+
| 0 | 0 |  | 0000-00-00 00:00:00 |
+---+---+--+---------------------+
のレコードが見える時がある。

との認識で合ってますでしょうか?


> 手元だと最終的には0件になったんですが、そうではなく2件残った
> ということですか?

テストだと確かに最後は0件でした。
本番環境で発生したものを、テストで再現したかったのですが出来なかった
のです。
ただ、似たような形が見えたので一旦送らせていただいた次第です。


実は気になっている点は、

+---+---+--+---------------------+
| 0 | 0 |  | 0000-00-00 00:00:00 |
| 0 | 0 |  | 0000-00-00 00:00:00 |
+---+---+--+---------------------+

設定してある Unique と Not NULL 制約はどうなっているのだろう!?!?
なのです。


> そのとき、INSERT/DELETEしている接続は1つだけでしたか?それと
> も複数の接続からINSERT/DELETEしていましたか?

発生した時の接続は1つだけ……の想定でしたが、複数接続でテストしたとこ
ろ、再現したいものの1つができました!

題名と合わなくなるので、新規で送らせていただきます。


P.S
> LOCK TABLES tbl_test_pat_0002 WRITE;

(^-^; さ、最後の武器に取っておいてよいですか?


----
各務 
kagam****@outwa*****




groonga-dev メーリングリストの案内
Back to archive index