0

個々のモデルを適用すると、挿入の実行をロールバックまたは防止する方法はありません
。MODEL_A:MODEL_Bは、撮影しても挿入されます。MODEL_B:MODEL_Aは、撮影してもException
挿入されます。Exception

$ 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{}

最初の挿入が挿入され、2番目がエラーをトリガーする場合、最初のロールバックとしてはありません
。アクションを実行する前に両方をテストする必要があり
ます。この問題を解決する方法について何か提案がありますか?

ありがとう

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 に答える