一起运行模型

时间:2013-03-25 06:03:10

标签: php mysql model pdo dao

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

,MODEL_A也会插入
$ MODEL_A-> insert();
$ MODEL_B-> insert();



//MODEL.A

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



//MODEL.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{}

如果插入第一个插入,第二个插入错误,则不要作为第一个回滚
两者都需要在执行动作之前进行测试 有人对如何解决这个问题有任何建议吗?

感谢

1 个答案:

答案 0 :(得分: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();
}