Phalcon PDO交易无法正常工作

时间:2016-06-20 18:35:25

标签: mysql transactions commit phalcon

我花了一整天才解决交易问题,但我失败了。 我的要求是在一个事务中的表主题和表topic_data中插入一条新记录。 我的代码是这样的:

// database connection
$di->set( 'db', function() use( $conf ) {
    return new \Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter( [
        'host' => $conf->db->host,
        'username' => $conf->db->username,
        'password' => $conf->db->password,
        'dbname' => $conf->db->dbname,
        'options' => [
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_PERSISTENT => true,
            \PDO::ATTR_AUTOCOMMIT => false
        ]
    ] ); 
} );

// transaction code
public function create( $params ) {
    $this->db->begin();

    $id = \Idalloc::next();
    $topic = new Topic();
    $topic->id = $id;
    $topic->ctime = $_SERVER[ 'REQUEST_TIME' ];

    $tags = $params[ 'tags' ];

    $params[ 'tags' ] = implode( ',', $tags );
    $topic->assign( $params );

    if( $topic->save() === false ) {
        $this->db->rollback();
        return false;
    }

    for( $i = 0, $l = count( $tags ); $i < $l; ++$i ) {
        $topicTag = new TopicTag();
        $topicTag->tag_id = $tags[ $i ];
        $topicTag->topic_id = $id;
        $topicTag->type = $params[ 'type' ];
        if( $topicTag->save() === false ) {
            $this->db->rollback();
            return false;
        }
    }

    var_dump( $this->db->isUnderTransaction() );

    $this->db->commit();
    return $id;
}

失败了:

  • 如果我没有设置\PDO::ATTR_PERSISTENT => true,返回$ id和var_dump( $this->db->isUnderTransaction() )的方法“create”为TRUE但是没有数据插入到表主题和表topic_tag中

  • 如果我设置\PDO::ATTR_PERSISTENT => true,我将获得Exception: [Tue, 21 Jun 16 02:16:21 +0800][ERROR] PDOException: There is no active transaction 仍然无法将数据插入表主题,但新记录显示在表topic_tag中。

  • 如果我只保留这两部分中的一部分,它将会运作良好。

如何解决此问题,是否有一种创建手动交易的简单方法?

1 个答案:

答案 0 :(得分:1)

我找到了这个问题的解决方案。必须共享DI中设置的“db”。所以需要另一个参数“TRUE”:

// database connection
$di->set( 'db', function() use( $conf ) {
    return new \Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter( [
        'host' => $conf->db->host,
        'username' => $conf->db->username,
        'password' => $conf->db->password,
        'dbname' => $conf->db->dbname,
        'options' => [
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_PERSISTENT => true,
            \PDO::ATTR_AUTOCOMMIT => false
        ]
    ] ); 
}, true );