晚上好。
我对是否包含在数据库中存有疑问。一个常见的例子是用户帐户,其中用户名必须是唯一的。
在以下逻辑中:
- 用户将数据输入到表单中
- 通过$_POST(或其他方法)收集数据
- 保存数据之前,检查用户名是否已注册
- 如果不是,则保存记录;如果是,则会通知用户用户名已存在
示例:
<?php
$username = $_POST['username'];
$query = "SELECT * FROM `user_tbl` WHERE `username` = '{$username}'";
$result = mysql_query($query);
if ( mysql_num_rows ( $result ) > 1 ) {
/* Username already exists */
echo 'Username already exists';
} else {
/* Username doesn't exist */
/* a certain time is elapsed after checking */
/* .. insert query */
}
我的问题是,在一个请求量很大的系统中,在检查用户名是否已经存在和包含(如果用户名不存在)之间,另一个用户是否可以在同一时间执行相同的操作?
更新
我知道关于安全的问题,用这个代码(副本和过去)来解释这个问题是关于两个用户同时做同一件事的可能性。关于唯一索引的问题,我知道它是如何工作的,也许我不清楚这个问题,只是想看看是否存在"同时命令发生"的可能性。谢谢你的回答。
除了已经放置了正确的注释之外,解决这个问题的方法是使用transaction&一个独特的索引:
唯一索引保证一个值只能存在一次。
在您的情况下,索引可能是:
CREATE UNIQUE INDEX idx_nn_1 ON user_tbl(username);
这样,用户只能存在一次。如果两个人现在同时插入相同的用户名,其中一个插入将失败。你需要抓住并处理的失败。