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

Back to archive index

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



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