使用MySQL唯一索引,具有良好的原子性,不会引起错误。

问题描述 投票:1回答:2

我有这个表。

User
    id INT PK
    login VARCHAR UNIQUE

我想知道处理UNIQUE索引插入的最佳方法(例如: 新用户创建)。

1) 我可以简单的INSERT,当出现 "重复条目 "时,我就会在应用程序中捕捉到异常并进行处理。

=>我不知道这是不是最好的解决方法。

2) 我可以选择......WHERE login =......,然后在没有找到记录的情况下进行INSERT,或者在选择找到东西的情况下显示一个错误。

=> 这不是原子的,一个插入可以发生在SELECT和INSERT之间。

3) 我可以启动一个事务,SELECT FOR UPDATE,INSERT,然后在没有找到记录的情况下COMMIT,或者ROLLBACK,如果用户已经存在,则显示一个错误。

=> 这根本行不通,因为MySQL不会锁定任何现有的行......。所以这肯定会导致死锁

那么如何处理这个非常简单的研究案例呢?

mysql indexing unique atomic atomicity
2个回答
0
投票

你可以做一个

INSERT IGNORE ...

MySQL手动INSERT

REPLACE ...

MySQL手册 REPLACE


0
投票

在我看来,你有两个选择。

1) 使用 锁台SELECT 然后 Insert. 锁定表可以确保你最终不会出现竞赛条件。

2)如果你担心表锁,你可以做你列出的第一个选项。INSERT 或者更好的办法是, INSERT IGNORE. 如果您使用 INSERT IGNORE 那么重复的键异常就会以警告的形式返回。

就我个人而言,我会尝试使用表锁,看看是否有效。你的 SELECT 语句应该运行得很快,因为它有一个唯一的键,所以我不会担心锁会让你的速度太慢。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.