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/