插入的同时,有可能发生吗?

时间:2016-04-03 02:14:18

标签: php mysql yii duplicates

晚上好。

我怀疑是否包含在数据库中。一个常见示例是用户帐户,其中用户名必须是唯一的。

在以下逻辑中:

  • 用户将数据输入表单。
  • 通过$ _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 */
}

我的问题是,在一个请求量很大的系统中,有可能在检查用户名是否已存在的时间和包含(如果用户名不存在)之间,另一个用户也可以这样做同时行动?

更新

我知道安全问题,使用此代码(复制和过去)来解释问题是关于两个用户同时做同样事情的可能性。关于唯一索引的问题,我知道它是如何工作的,也许我不清楚这个问题,只是看看是否有可能同时发生命令。&#34;谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

除了已经放置正确的评论之外,解决方法是使用交易&amp;一个独特的指数:

  

唯一索引保证值只能存在一次。

在您的情况下,索引可以是:

CREATE UNIQUE INDEX idx_nn_1 ON user_tbl(username);

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