yoku ts.
yoku0****@gmail*****
2015年 5月 19日 (火) 00:34:46 JST
こんばんは、yoku0825です。 別件の方が全然再現しませんが、色々勉強になります。 > > 実は気になっている点は、 > > > > +---+---+--+---------------------+ > > | 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だったり空文字列だったりするからです。 出力がmysqlコマンドラインクライアントのものっぽいので補足すると、 あやつは本物の(?) NULLが入っていたときは"NULL"という4文字の文字列を返すので、 NULLじゃなくて空文字列なんじゃないですかね。 https://github.com/mysql/mysql-server/blob/5.6/client/mysql.cc#L3764-L3768 > > P.S > >> LOCK TABLES tbl_test_pat_0002 WRITE; > > > > (^-^; さ、最後の武器に取っておいてよいですか? > > はい! get_lock関数という手もありますよ! :) https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_get-lock 2015年5月18日 23:08 Kouhei Sutou <kou****@clear*****>: > 須藤です。 > > 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 mailing list > groon****@lists***** > http://lists.osdn.me/mailman/listinfo/groonga-dev