我们在维基站点上遇到问题(使用mysql 5.5.9)。有一个text
表和一个revision
表,其中revision.rev_text_id
是text.old_id
的外键(没有新的,请问维基媒体)。
有一个INSERT INTO text...
,然后是INSERT INTO revision...
,它使用从上一个查询中收到的新old_id
/ rev_text_id
。
第二个查询有效,第一个 - 我不确定。事情是在整个过程完成之后(有几十个查询),revision
行就在那里,在rev_text_id
列中有一个新的新值。
但是,text
行不存在。有趣的是 - text
表自动增量会提升,因为下一个操作会跳过old_id
的值,缺少的值与我们在revision
表中的值相匹配。
第一个查询是否有可能使自动增量索引提前但实际上没有插入行?是什么原因造成的?
ADDTITION
当我从日志中复制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`
...
再多SELECT
秒。暂停活动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
等
答案 0 :(得分:1)
第一个查询是否有可能使自动增量索引提前但实际上没有插入行?是什么原因造成的?
是的,当您尝试在具有auto_increment列的表中插入行时,插入将失败,但auto_increment值将增加1.
如果您决定将表转换为InnoDB,我建议您使用交易。这样,如果查询失败,则不会插入任何查询。