ただ,InnoDB はロックの粒度が細かいのはいいんですが,注意しないとデッドロックが
発生してしまうという......そのため,登録処理は単純に START TRANSACTION 〜 COMMIT で
挟むだけじゃダメですね.words テーブルの書き込みは AUTO-INC のロックと行ロックが交錯するし,
行ロックのかかる順番もまちまちなんで,GET_LOCK() 〜 RELEASE_LOCK() で挟んでデッドロック回避.
この GET_LOCK() はテーブルロックとは違うものなので,SELECT での読み出しには影響しません.
CREATE PROCEDURE registurl(urlx varchar(256), mtimex int, totalwordsx int unsigned)
BEGIN
DECLARE urlid, totaldocs bigint unsigned;
START TRANSACTION;
SELECT id INTO urlid FROM urls WHERE url = urlx FOR UPDATE;
IF urlid IS NOT NULL THEN
IF GET_LOCK('keywords.words', 10) THEN
UPDATE regwords, words SET words.df = words.df - 1 WHERE regwords.url_id = urlid AND words.id = regwords.word_id;
DO RELEASE_LOCK('keywords.words');
DELETE FROM dispwords WHERE url_id = urlid;
DELETE FROM regwords WHERE url_id = urlid;
ELSE
ROLLBACK;
TRUNCATE tmpwords;
SET urlid = NULL, totalwordsx = NULL;
START TRANSACTION;
END IF;
END IF;
IF totalwordsx IS NULL THEN
DELETE FROM urls WHERE id = urlid;
UPDATE count_urls SET n = n - 1 WHERE urlid IS NOT NULL;
COMMIT;
ELSE
DO LAST_INSERT_ID(0);
INSERT urls (url, mtime, totalwords) VALUES (urlx, FROM_UNIXTIME(mtimex), totalwordsx)
ON DUPLICATE KEY UPDATE mtime = VALUES(mtime), totalwords = VALUES(totalwords);
IF urlid IS NULL THEN
SET urlid = LAST_INSERT_ID();
UPDATE count_urls SET n = n + 1 WHERE urlid;
END IF;
IF urlid && GET_LOCK('keywords.words', 10) THEN
INSERT words (word) SELECT word FROM tmpwords ON DUPLICATE KEY UPDATE df = words.df + 1;
DO RELEASE_LOCK('keywords.words');
UPDATE tmpwords JOIN words USING (word) SET tmpwords.id = words.id, tmpwords.df = words.df;
INSERT regwords SELECT urlid, id, tf FROM tmpwords;
SELECT n INTO totaldocs FROM count_urls;
INSERT dispwords SELECT urlid, id, tf / totalwordsx * (LN(totaldocs / df) + 1) tfidf
FROM tmpwords WHERE totaldocs / df < 100000 ORDER BY tfidf DESC LIMIT 10;
COMMIT;
ELSE
ROLLBACK;
END IF;
TRUNCATE tmpwords;
END IF;
END
関連キーワードをなんとかしようスレ
■ このスレッドは過去ログ倉庫に格納されています
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【ゲーム】「余命宣告を受けた息子の為に“Switch2”を優先的に買わせて欲しい」母親が任天堂に直談判した結果… ★2 [ネギうどん★]
- 【石破首相】消費税減税について3点あげ否定的な考え示す「次の時代に責任を持つ。本当に困窮の方に手厚い措置する」 [ぐれ★]
- 【田中圭との不倫報道】《憔悴の近影》永野芽郁、頬がこけ、目元を腫らして…移動時には“厳戒態勢”「事務所車までダッシュ」 [Ailuropoda melanoleuca★]
- 【千葉】若葉区 殺人事件 中学3年生の15歳少年 殺人の疑いで逮捕 2人は面識なしか [ぐれ★]
- 「ひきこもり遍路2025」参加者サポーター代理参拝など募集開始…自分なりの生き方を見つける四国1,200kmの旅へ~参加費45万円 [おっさん友の会★]
- 【野球】巨人・秋広優人、大江竜聖とソフトバンク・リチャードの2対1電撃トレード成立 ★2 [Ailuropoda melanoleuca★]
- 【悲報】石破「西田昌司とは認識が全く異なる」衆院予算委員会 [196352351]
- 三三👊😅👊💥🏡💥👊😅👊三三
- 【速報】アメリカ、中国製品への関税145⇒30%に、中国、アメリカ製品への関税125⇒10%に引き下げ。90日間 [718678614]
- __米国は中国製品への関税を90日間、145%から30%に引き下げ、中国は米国への関税を90日間、125%から10%に引き下げ [827565401]
- 万博・吉本パビリオン跡地に明石家さんま邸建設へ 「カジノにチャリで直行したい」 [377482965]
- 日本人「やっぱアサリは熊本産に限る!」→実は中国産でした!!みたいな話して他にある? [472617201]