我有这个表。
User
id INT PK
login VARCHAR UNIQUE
我想知道处理UNIQUE索引插入的最佳方法(例如: 新用户创建)。
1) 我可以简单的INSERT,当出现 "重复条目 "时,我就会在应用程序中捕捉到异常并进行处理。
=>我不知道这是不是最好的解决方法。
2) 我可以选择......WHERE login =......,然后在没有找到记录的情况下进行INSERT,或者在选择找到东西的情况下显示一个错误。
=> 这不是原子的,一个插入可以发生在SELECT和INSERT之间。
3) 我可以启动一个事务,SELECT FOR UPDATE,INSERT,然后在没有找到记录的情况下COMMIT,或者ROLLBACK,如果用户已经存在,则显示一个错误。
=> 这根本行不通,因为MySQL不会锁定任何现有的行......。所以这肯定会导致死锁
那么如何处理这个非常简单的研究案例呢?
在我看来,你有两个选择。
1) 使用 锁台 和 SELECT
然后 Insert
. 锁定表可以确保你最终不会出现竞赛条件。
2)如果你担心表锁,你可以做你列出的第一个选项。INSERT
或者更好的办法是, INSERT IGNORE
. 如果您使用 INSERT IGNORE
那么重复的键异常就会以警告的形式返回。
就我个人而言,我会尝试使用表锁,看看是否有效。你的 SELECT
语句应该运行得很快,因为它有一个唯一的键,所以我不会担心锁会让你的速度太慢。