我正在开发一个基本上由两个表组成的消息传递系统:CONVERSATIONS 和 MESSAGES。该过程检查是否存在对话,如果存在,它将对话 ID 保存到 VAR 中并将其用于消息插入。如果没有,它会在对话表中创建一个条目,并使用 LAST ID 作为 MESSAGES 表的条目值。
到目前为止它工作得很好,但我有两个问题:
在我无知的观点中,如果更多用户同时调用该过程,那么如此定义的 VARS @last_id 和 @conv_id 可能会发生某种冲突。想象一下@last_id 设置为 40,在插入发生之前,另一个用户调用了相同的过程,并且该值设置为 41 .. 这有可能吗?
这个 INSERT 过程似乎很慢,一旦被缓存,虽然它似乎变得有点快,但我对它不满意。除了 INDEXING 有什么解决办法吗?
谢谢你。
DELIMITER //
CREATE PROCEDURE chat_insert(id1 INT, id2 INT, text VARCHAR(250))
BEGIN
SELECT id INTO @conv_id FROM conversations WHERE
(user_id_one = id1 AND user_id_two = id2)
OR (user_id_one = id2 AND user_id_two = id1) LIMIT 1;
IF(@conv_id IS NOT NULL)
THEN
INSERT INTO messages (conversations_id,user_id,text)
VALUES (@conv_id,id1,text);
ELSE
INSERT INTO conversations (user_id_one,user_id_2)
VALUES (id1,id2);
SET @last_id = LAST_INSERT_ID();
INSERT INTO messages (conversations_id,user_id,text)
VALUES (@last_id,id1,text);
END IF;
END
//