[groonga-dev,03243] mroongaで複数接続による同一レコードの登録、削除を繰り返すと、ユニーク制約が効かなくなる

Back to archive index

各務 洋 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*****




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