pinguo/php-msf

yield 使用临时表时出现问题

nekic opened this issue · 1 comments

nekic commented

当我使用 yield 创建临时表时,返回结果应该创建成功并且有记录的,但是查询临时表时报错,提示 临时表不存在!

以下示例代码:

    {
        // 删除临时表
        $db =  yield $this->getMysqlPool('master');
        $tableName = 'tmp_user_info';

        $dropSql = 'DROP TABLE IF EXISTS ' . $tableName .';';

        yield $db->go(null,$dropSql);

        $querySql = "SELECT * FROM user_info WHERE create_at = '1514691308'";

        $createTmpTblSql = "CREATE TEMPORARY TABLE  {$tableName}  ({$querySql}) ;";

        $res1 = yield $db->go(null,$createTmpTblSql);

        dump($res1);
        /* 输出结果
         [
            'client_id' => 0
            'result' => true
            'affected_rows' => 8
            'insert_id' => 0
         ]
         */

        $res2 = yield $db->select('*')->from($tableName)->limit(1)->go();
        dump($res2);
        /*
         * [mysql]:Table 'demo_user.tmp_user_info' doesn't exist[sql]:SELECT * FROM tmp_user_info LIMIT 1
         */
        return $res2;
    }`

worker进程使用的是连接池,每次执行完MySQL的指令,连接就会归还到池中,所以每个MySQL指令对应的执行连接,实际上是不可控的,由于临时表只对当前连接有效,所以在worker进程中不能使用临时表。如果必须要使用临时表,请在task中使用,但是需要注意不要使用长连接。