4

我一个接一个地执行两个查询:一个是 INSERT,另一个是 SELECT,它选择插入的行。尽管该行已成功插入(我可以在数据库中看到它),但选择查询无法返回该行。

当我再次执行 SELECT 查询时,它会返回正确的结果。

插入:

    $stmt = $pdo->prepare('INSERT INTO user (id ,name, lastname ,birthday, social_type, social_id) VALUES(NULL, :name, :lastname, :birthday, :social_type, :social_id)');
    $success=$stmt->execute(array(
        ':name' => $user['name'],
        ':lastname' => $user['lastname'],
        ':birthday' => $user['birthday'],
        ':social_type' => $user['social_type'],
        ':social_id' => $user['social_id']      
    ));

选择

    $stmt = $pdo->prepare('SELECT * FROM user WHERE social_id = :social_id AND social_type = :social_type LIMIT 1');
    $stmt->execute(array(
        'social_id' => $user['social_id'],
        'social_type' => $user['social_type'] ));
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
4

1 回答 1

2

如果您使用的是 INNODB:

如果您使用的是 INNODB,由于您验证了该行已插入,因此只要 SELECT 正在查询插入的实际行的键,它就应该与 SELECT 一起返回。(你确定你没有使用像 INSERT DELAYED 这样的功能吗?这可能会阻止该行被返回。)

如果您使用的是 MYISAM:

由于 MyISAM 不支持事务,因此 SELECT 应该返回插入,但我找不到任何说明这实际上是有保证的。

注意:下面列出的第一个 URL 说明如果您使用的是 MISAM(根据此链接的默认值),INSERTS 将锁定表。但是,第二个 URL 声明插入所放置的锁是可读锁,因此不应该阻止读取表。

http://www.sitepoint.com/mysql-mistakes-php-developers/

http://aarklondatabasetrivia.blogspot.com/2009/04/how-to-lock-and-unlock-tables-in-mysql.html

如果您使用的是 INNODB(续):

    如果您的系统中正在使用 AUTOCOMMIT(我不确定),您应该已经看到选定的行(这个问题表明插入的行已被验证为已添加到数据库中)。

    如果正在使用事务,则必须已提交事务(此问题表明插入的行已被验证为已添加到数据库中)。

    您确定第一次执行的 SELECT 查询与第二次执行的查询相同吗?

    您确定$user['social_id']在 INSERT 之后和 SELECT 时的值相同吗?

    如果由于某种原因您正在使用 INSERT DELAYED,则可能不会返回该行


注意:根据此 URL,如果您已启动事务,则所选行将显示在下一个 SELECT 语句中(不是在 PHP 中):

http://zetcode.com/databases/mysqltutorial/transactions/

这个语句意味着如果你开始一个事务,你不需要设置 AUTOCOMMIT:

“MySQL 还会自动提交不属于事务的语句。”

此 URL 描述了如何在 PHP 中启动事务:

PHP + MySQL 事务示例

于 2013-01-07T18:44:03.603 回答