我有一个存储过程从"票证"表生成UID,但在负载下我遇到了很多死锁.每当我的任务需要新的UID时,我就会从多个并发连接中多次调用此过程.
BEGIN
DECLARE a_uid BIGINT(20) UNSIGNED;
START TRANSACTION;
SELECT uid INTO a_uid FROM uid_data FOR UPDATE; # Lock
INSERT INTO uid_data (stub) VALUES ('a') ON DUPLICATE KEY UPDATE uid=uid+1;
SELECT a_uid+1 AS `uid`;
COMMIT;
END
Run Code Online (Sandbox Code Playgroud)
我考虑过使用:
BEGIN
REPLACE INTO uid_data (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
END
Run Code Online (Sandbox Code Playgroud)
但是我不确定这对于并发连接是否安全,因为没有锁定,不像第一个程序SELECT FOR UPDATE.
这是表格:
mysql> DESCRIBE uid_data;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| uid | bigint(20) unsigned | NO | PRI | …Run Code Online (Sandbox Code Playgroud)