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/