各務 洋
kagam****@outwa*****
2015年 5月 18日 (月) 18:05:03 JST
お世話になります、各務です。 ようやく Unique 制約のフィールドに重複して値が入るのが再現できました。 ---------------------------------------------------------------------- 現象: mroonga で複数の接続から同一レコードの登録、削除を繰り返すと、ユニーク 制約が効かず、重複したキーのレコードが複数登録される。 発生頻度は毎回。 ---------------------------------------------------------------------- 環境: CentOS 6.5 groonga-libs.x86_64 5.0.3-1.el6 mysql-community-mroonga.x86_64 5.02-1.el6 mysql-community-server.x86_64 5.6.24-3.el6 ストレージモード マスター/スレーブの2台構成です。 ---------------------------------------------------------------------- 再現手順: CREATE DATABASE db_test; USE db_test; CREATE TABLE `tbl_test_pat_0005` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `t1_date` TIMESTAMP NOT NULL DEFAULT current_timestamp, `t2_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00', `a_id` BIGINT(20) NOT NULL Default 0, `t_text` LONGTEXT, PRIMARY KEY (`id`), UNIQUE KEY `a_id` (`a_id`), FULLTEXT INDEX `t_text` (`t_text` ) COMMENT 'normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ; -- 下記を1000回繰り返すものを 「mix05.sql」 として準備 INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001'); DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ; DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ; コンソール1から while true; do mysql -tN db_test <./mix05.sql|tee -a v1.txt; done 別接続のコンソール2から while true; do mysql -tN db_test <./mix05.sql|tee -a v2.txt; done 同3から while true; do mysql -tN db_test <./mix05.sql|tee -a v3.txt; done 同4から while true; do mysql -tN db_test <./mix05.sql|tee -a v4.txt; done しばらく待ってみてから Ctrl + C で止める。 SELECT * FROM tbl_test_pat_0005; +------+---------------------+---------------------+-------+--------+ | id | t1_date | t2_date | a_id | t_text | +------+---------------------+---------------------+-------+--------+ | 6497 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6527 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6535 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6554 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6556 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6674 | 2015-05-18 12:58:52 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6707 | 2015-05-18 12:58:53 | 0000-00-00 00:00:00 | 10001 | t10001 | | 6837 | 2015-05-18 12:58:56 | 0000-00-00 00:00:00 | 10001 | t10001 | | 0 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 0 | | | 2791 | 2015-05-18 12:58:12 | 0000-00-00 00:00:00 | 10001 | t10001 | | 4057 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 | | 4135 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 | | 4315 | 2015-05-18 12:58:28 | 0000-00-00 00:00:00 | 10001 | t10001 | | 4436 | 2015-05-18 12:58:30 | 0000-00-00 00:00:00 | 10001 | t10001 | | 4559 | 2015-05-18 12:58:31 | 0000-00-00 00:00:00 | 10001 | t10001 | | 5052 | 2015-05-18 12:58:35 | 0000-00-00 00:00:00 | 10001 | t10001 | | 5078 | 2015-05-18 12:58:36 | 0000-00-00 00:00:00 | 10001 | t10001 | +------+---------------------+---------------------+-------+--------+ と、Unique が期待される a_id に値が重複して登録されている。 id 0 のレコードが出来ている。 ---------------------------------------------------------------------- 期待する動作: Unique 制約を保って欲しい replication が切れないようにして欲しい。(← 自分用メモ:slave_exec_mode を戻してみる) id 0 のレコードが残らないようにして欲しい。 ---------------------------------------------------------------------- 確認した事項: replication は Slave側が 最初の Error 'Duplicate entry '10001' for key 'a_id'' on query. Default database: 'db_test'. Query: 'INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001')' で切断され、重複した値は入っていませんでした。 もっとシンプルなテストだと、重複が発生しないのもありました。 上記でいかがでしょうか?よろしくお願いします。 ---- 各務 kagam****@outwa*****