0

我们在 wiki 站点上遇到问题(使用 mysql 5.5.9)。有一张text表,还有一张revision表,其中revision.rev_text_id有一个外键text.old_id(没有新的,问维基媒体)。

有一个INSERT INTO text..., then它使用从前一个查询中收到INSERT INTO revision...的新old_id/ 。rev_text_id

第二个查询有效,第一个 - 我不确定。事情是在整个事情完成之后(还有几十个查询),revision行就在那里,在它的列中有一个新的值rev_text_id

但是,该text行不存在。有趣的事情 -text表自动增量前进,因为下一个动作跳过它的值old_id,缺失值匹配我们在revision表中的值。

尽管实际上并未插入行,但第一个查询是否有可能使自动增量索引提前?这是什么原因造成的?

加法

当我从日志中复制INSERT INTO text查询并在服务器上运行时 - 它执行得很好(行已添加到表中)

编辑

完整的查询是:

INSERT INTO text (old_id,old_text,old_flags) VALUES (NULL,'{text input by user}','utf8');
INSERT INTO `revision` (rev_id,rev_page,rev_text_id,rev_comment,rev_minor_edit,rev_user,rev_user_text,rev_timestamp,rev_deleted,rev_len,rev_parent_id,rev_sha1) VALUES (NULL,'{pageId}','{textId}','{comment}','{isMinor}','{userId}','{userName}','{TS}','{isDeleted}','{length}','{parentRevision}','{HASH}')"

此外,如果相关,text表正在运行 InnoDB 并且revision是 MyISAM。

编辑

来自日志的更多信息:

错误的请求

BEGIN
INSERT  INTO `text`
INSERT  INTO `revision`
UPDATE  `page` SET page_latest
INSERT  INTO `recentchanges`
INSERT  INTO `cu_changes`
SELECT  wl_user  FROM `watchlist` 
SELECT  user_id  FROM `user` 
SELECT  user_id,user_name,user_real_name,user_password,user_newpassword,user_newpass_time,user_email,user_touched,use
SELECT  ug_group  FROM `user_groups` 
SELECT  up_property,up_value  FROM `user_properties` 
SELECT  user_id,user_name,user_real_name,user_password,user_newpassword,user_newpass_time,user_email,user_touched,use
SELECT  ug_group  FROM `user_groups` 
SELECT  up_property,up_value  FROM `user_properties` 
SELECT  lc_value  FROM `l10n_cache` 
SELECT  lc_value  FROM `l10n_cache`
...

还有几个SELECTs。活动暂停 2 秒,然后日志中有来自新用户的命令,不再有来自该用户的查询(在同一线程上)。

同一用户对不同页面的编辑,进展顺利:

BEGIN
INSERT INTO `text`
INSERT INTO `revision`
UPDATE `page` SET page_latest
INSERT INTO `recentchanges`
INSERT INTO `cu_changes`
SELECT wl_user  FROM `watchlist` 
COMMIT
BEGIN
UPDATE `watchlist` SET wl_notificationtimestamp
COMMIT
BEGIN
SELECT user_id  FROM `user`
SELECT user_id,user_name,user_real_name,user_password,user_newpasswo
SELECT ug_group  FROM `user_groups` 
SELECT up_property,up_value  FROM `user_properties` 
SELECT *  FROM `user` 
SELECT up_property,up_value  FROM `user_properties` 
INSERT INTO `logging`
UPDATE `user` SET user_editcount=user_editcount+1
SELECT 1  FROM `user` 
UPDATE `user` SET user_touched = '20121227211743'
COMMIT

等等

4

1 回答 1

1

尽管实际上并未插入行,但第一个查询是否有可能使自动增量索引提前?这是什么原因造成的?

是的,当您尝试在具有 auto_increment 列的表中插入一行时,插入将失败,但 auto_increment 值将增加 1。

如果您决定将表转换为 InnoDB,我建议您使用事务。这样,如果一个查询失败,它们都不会被插入。

于 2012-12-31T07:27:44.583 回答