小编Sen*_*cha的帖子

MySQL死锁与存储过程生成UID

我有一个存储过程从"票证"表生成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)

mysql deadlock innodb stored-procedures

6
推荐指数
1
解决办法
1062
查看次数

标签 统计

deadlock ×1

innodb ×1

mysql ×1

stored-procedures ×1