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

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 5月 18日 (月) 23:08:13 JST


須藤です。

In <20150****@domai*****>
  "[groonga-dev,03242] Re: mroongaで同一レコードの登録、削除を繰り返すと値が抜ける事がある(解決)" on Mon, 18 May 2015 18:02:32 +0900,
  各務 洋 <kagam****@outwa*****> wrote:

> 分かりやすい説明ありがとうございます!INSERT 時をざっくりまとめると、
> 
> Default 値でカラム毎のレコードを一気に作成し、
> その後各カラム毎に値を update していく。
> 制約違反があれば全部消してエラーにする。
> 
> その処理の途中で SELECT すると、期待する値の入っていない
> +---+---+--+---------------------+
> | 0 | 0 |  | 0000-00-00 00:00:00 |
> +---+---+--+---------------------+
> のレコードが見える時がある。
> 
> との認識で合ってますでしょうか?

はい、だいたい、あっています。

実際は

  * レコード作成
  * 制約チェック
  * 順にカラムの値をセット

という順番です。

カラムにデフォルト値が設定されていればMySQLがMroongaにデフォ
ルト値を渡してくれます。なので、デフォルト値が設定されている
ときでも、デフォルト値をセット→指定された値をセット、という
ように2回値をセットすることはなく、1回の更新では1回しか値を
設定しません。

なお、SELECTしたときに0になっているのはMroonga(Groonga)は
カラムの値をすべて0で初期化するからです。

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

なるほど。わかりました。

> 実は気になっている点は、
> 
> +---+---+--+---------------------+
> | 0 | 0 |  | 0000-00-00 00:00:00 |
> | 0 | 0 |  | 0000-00-00 00:00:00 |
> +---+---+--+---------------------+
> 
> 設定してある Unique と Not NULL 制約はどうなっているのだろう!?!?
> なのです。

Mroongaはレコードを追加してから制約チェックをしているので
こうなっています。

NOT NULLのチェックはMySQLレベルでやってくれている気がします。
↑でNULLが入っているように見えるのは、Mroonga(Groonga)はカ
ラムの初期値が0だったり空文字列だったりするからです。カラム
の値を設定する前にカラムの値を読み込むと↑のようになります。

>> そのとき、INSERT/DELETEしている接続は1つだけでしたか?それと
>> も複数の接続からINSERT/DELETEしていましたか?
> 
> 発生した時の接続は1つだけ……の想定でしたが、複数接続でテストしたとこ
> ろ、再現したいものの1つができました!
> 
> 題名と合わなくなるので、新規で送らせていただきます。

ありがとうございます。

> P.S
>> LOCK TABLES tbl_test_pat_0002 WRITE;
> 
> (^-^; さ、最後の武器に取っておいてよいですか?

はい!

--
須藤功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
プログラミングが好きな学生のための勉強会:
  http://www.seplus.jp/sezemi/




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