2013-03-25 3 views
0

Применение каждой отдельной модели, нет никакого способа отката или предотвратить любое вставить рывок
MODEL_A: MODEL_B вставляет даже если стрелять Exception
MODEL_B: MODEL_A вставляет даже если стрелять 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{} 



// Procedual бы простое решение

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

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

Если первая вставка вставляется, а второй спусковой крючок ошибки, не имеют как первый откат
Оба должны быть протестированы перед выполнением действия
У кого-либо есть предложения по решению этого вопроса oblem?

Благодаря

+0

использовать 'START TRANSACTION' на начало кода, и' COMMIT' в конце концов, все в порядке. Если нет, 'ROLLBACK'. см. http://dev.mysql.com/doc/refman/5.0/en/commit.html – MatRt

ответ

1

Вы должны явно начать транзакцию путем включения и выключения автоматической фиксации, а затем либо фиксации или отката транзакции после того, как вы сделали тесты. Вы можете сделать это с помощью PDO, используя функции beginTransaction(), commit() и rollback().

Если вставка находится в разрозненных классах, вы можете передать ссылку на ваш объект $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(); 
} 
+0

да, но каждая операция выполняется в отдельных моделях. –

+0

Извините, вам просто нужно передать ссылку на '$ pdo', чтобы сделать это – doublesharp

+0

? 'beginTransaction | $ MODEL_A :: insert() | $ MODEL_B :: insert() | commit' –