[groonga-dev,00838] Re: 連続INSERT時に全文検索でエラー

Back to archive index

Kouhei Sutou kou****@clear*****
2012年 5月 9日 (水) 17:47:00 JST


須藤です。

In <20120****@clear*****>
  "[groonga-dev,00836] Re: 連続INSERT時に全文検索でエラー" on Wed, 09 May 2012 15:59:27 +0900 (JST),
  Kouhei Sutou <kou****@clear*****> wrote:

>>> それでは、お言葉に甘えて、下記スキーマ定義をお送りさせて頂きます。
>>> 参考になれば幸いです。
>> 
>> ありがとうございます!
>> こちらで再現できないか確認してみます!
> 
> 頂いた情報をもとに、再現できるようになった気がします!
>   http://redmine.groonga.org/issues/1322#note-9
> 
> まずは、この問題を修正して、その後、今回ご報告いただいた問題
> も修正されるかを確認してもらえればなぁと思っています。

こちらで確認した現象は修正しました。
修正方法は「トランザクション中に追加されたレコードを無視する」
です。ただし、トランザクション中にレコードを更新していた場合
は、他の接続からもその更新結果が見えてしまいます。(通常はコ
ミットするまでは他の接続から見えない。)こちらはmroongaのラッ
パーモードの制限になります。

例えば、以下のようになります。

client1:
  CREATE TABLE t1 (
    c1 INT PRIMARY KEY,
    c2 TEXT,
    FULLTEXT INDEX (c2)
  ) ENGINE=mroonga DEFAULT CHARSET=UTF8 COMMENT='ENGINE "InnoDB"';
  INSERT INTO t1 VALUES(1, 11, "aa ii uu ee");
  INSERT INTO t1 VALUES(2, 12, "ka ki ku ke");
  INSERT INTO t1 VALUES(3, 13, "sa si su se");

client2:
  SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ta") ORDER BY c1;
  # Empty set (0.00 sec)

client1:
  START TRANSACTION;
  UPDATE t1 SET c2 = "ta ti tu te" WHERE c1 = 1;
  
client2:
  (本当はここでは↑のUPDATEの結果が使われないことが期待される。
    全文検索はUPDATEの結果でヒットするが返されるレコードの値
    はUPDATEの結果は使われない。)
  SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ta") ORDER BY c1;
  # +----+-------------+
  # | c1 | c2          |
  # +----+-------------+
  # |  1 | aa ii uu ee |
  # +----+-------------+
  # 1 row in set (0.01 sec)

client1:
  COMMIT;

client2:
  (ここでUPDATEの結果が使われるのは正しい。返される値も正しい。)
  SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ta") ORDER BY c1;
  # +----+-------------+
  # | c1 | c2          |
  # +----+-------------+
  # |  1 | ta ti tu te |
  # +----+-------------+
  # 1 row in set (0.00 sec)


もし、COMMITではなくROLLBACKをすると不整合が発生します。
(インデックスだけが更新されて実際の値は更新されていない状態
になる。)

この場合は、REPAIR TABLEで復旧できます。
次のリリースからは

  ALTER TABLE DISABLE KEYS;
  ALTER TABLE ENABLE KEYS;

で、より高速に復旧できるようになります。


1点気になるのは、ご報告いただいた現象では、トランザクション
を終了した後も問題が継続する、という点です。こちらで確認した
ケースではトランザクションが終了したら問題が解決したんですよ
ね。。。

今回の修正方法では、ラップしているエンジンでレコードが見つか
らなかったら無視して次のレコードを探すようにしているので、ご
報告いただいた問題も解決するような気がするのですが、こちらで
のケースと何が違うのか、とても気になります。。。


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

groongaサポート:
  http://groonga.org/ja/support/
プログラミングが好きなソフトウェア開発者を募集中:
  http://www.clear-code.com/recruitment/




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