插入的同时,也有可能发生


Insert the same time, it is possible to happen?

晚上好。

我对是否包含在数据库中存有疑问。一个常见的例子是用户帐户,其中用户名必须是唯一的。

在以下逻辑中:

  • 用户将数据输入到表单中
  • 通过$_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);

这样,用户只能存在一次。如果两个人现在同时插入相同的用户名,其中一个插入将失败。你需要抓住并处理的失败。