MySQL事务如何工作以及何时回滚?

时间:2019-03-13 14:34:06

标签: php mysql mysqli pdo transactions

我不知道交易如何进行。 如果发生任何错误/异常,我是否需要回滚,在该错误/异常处将抛出异常并且永远不会到达 commit()调用?如果是这样,为什么以及如何做?究竟回滚是什么?

考虑以下PHP代码(某些Java代码执行类似的操作):

public function deleteAll():void{
    $stmt = $this->con->prepare(
            'DELETE FROM dd WHERE 1'
        );

    $this->con->begin_transaction();
    if(!$stmt->execute()){
        throw new Exception($stmt->error);
    }
    $this->con->commit();
}

public function insert(array $list):void{
    $stmt = $this->con->prepare(
        'INSERT INTO dd(cc) VALUES(?)'
    );
    $stmt->bind_param('s', $v);

        $this->con->begin_transaction();
    foreach($list as $v){
        if(!$stmt->execute()){
            throw new Exception($stmt->error);
        }
    }
    $this->con->commit();
}

注意: $ this-> con是mysqli连接对象(不使用PDO,虽然有所不同,但是PDO和mysqli会做类似上面的事情)。 数据库是MySQL,表使用InnoDB引擎。

某些人代码显示他们捕获到异常并进行回滚。但是我没有这样做,因为如果抛出Exception,则永远不会执行 commit()。然后,这让我想知道为什么根本需要回滚。

我的假设是,是否有多个查询同时执行,如下所示:

public function replaceAllWith(array $list):void{
    $this->con->begin_transaction();
    try{
        //do both previous queries at once
        $this->deleteAll();
        $this->insert($list);

        $this->con->commit();
    }catch(Exception $e){
        //error
        $this->con->rollback();
    }
}

,但是它仍然无法回滚,因为每个方法/功能都是通过不同的方法和不同的事务来完成和提交的。 第二个问题:我是在每个方法调用中执行每个事务,还是仅在'boss / parent'函数中调用事务,该函数仅调用和协调'subordinate / helper' em>函数可以工作吗?

不确定我是否要问正确的问题。 数据库事务令人困惑,许多在线资源仅显示过程过程(仅提交或随后立即回滚,这与常规直接查询没有区别)而没有涉及OO的概念。请任何专业人士指导并提供一些建议。

0 个答案:

没有答案