0

应用每个单独的模型,无法回滚或阻止任何插入运行
MODEL_A:即使射击Exception
MODEL_B 也会插入 MODEL_B:即使射击也会插入 MODEL_AException

$ MODEL_A-> insert();
$ MODEL_B-> insert();



//模型.A

try {
    $statement = $pdo-> prepare( "INSERT INTO ..." );
    $statement-> execute();
}catch{}



//模型.B

try {
    $statement = $pdo-> prepare( "INSERT INTO ..." );
    $statement-> execute();
}catch{}



//程序将是简单的解决方法

try {
    #beginTransaction;
    $statement = $pdo-> prepare( "INSERT INTO ..." );
    $statement-> execute();

    $statement = $pdo-> prepare( "INSERT INTO ..." );
    $statement-> execute();
    #commit;
}catch{}

如果第一个insert被插入,第二个触发错误,不用作为第一个rollback
执行动作前都需要测试
有人对如何解决这个问题有什么建议吗?

谢谢

4

1 回答 1

1

您需要通过关闭自动提交来显式启动事务,然后在完成测试后提交或回滚事务。您可以使用beginTransaction()commit()rollback()函数对 PDO 执行此操作。

如果插入位于不同的类中,则可以传递对$pdo对象的引用。

class ModelA {
    function insert(&$pdo){
        $statement = $pdo->prepare( "INSERT INTO ..." );
        $statement->execute();
    }
}

class ModelB {
    function insert(&$pdo){
        $statement = $pdo->prepare( "INSERT INTO ..." );
        $statement->execute();
    }
}

您的代码将如下所示:

// disable autocommit
$pdo->beginTransaction(); 

$modelA = new ModelA();
$modelA->insert($pdo);

$modelB = new ModelB();
$modelB->insert($pdo);

// check for errors, and either commit() or rollback()
$hasErrors = ? // Add your code to check for errors
if ($hasErrors){
    $pdo->rollback();
} else {
    $pdo->commit();
}
于 2013-03-25T06:26:31.873 回答