2010-07-28 3 views
5

моя проблема есть, у меня есть проект базы данных по этой ссылке is my database overdesigned?Где откат транзакции в PDO?

редактирование * ok возможно использование транзакции? но где я должен положить откат, если он терпит неудачу?

$dbConnect->beginTransaction(); 
$RegisterInsert = $dbConnect->prepare("INSERT INTO companies (
    `name`, `address`, `email`, `phone`, `link`, `verified`) VALUES (
    :name, :address, :email, :phone, :link, :verified)"); 
    $RegisterInsert->execute($RegisterData); 

    $RegisterData2['CID'] = $dbConnect->lastInsertId(); 

    $RegisterInsert = $dbConnect->prepare("INSERT INTO users_companies (
    `UID`, `CID`, `role`) VALUES (
    :UID, :CID, :role)"); 
    $RegisterInsert->execute($RegisterData2); 
    $dbConnect->commit(); 

, где я должен положить откат?

Благодаря

+1

Я бы сказал, да ... – pascal

+0

да им немного запутался я должен делать сделки вещь? (я никогда не использовал его) или просто так, или, может быть, присоединился? или другие, которые я мог пропустить, спасибо pascal, чтобы оставить комментарий :) – 2010-07-28 09:21:07

+0

Возможный дубликат: http://stackoverflow.com/questions/2167853/insert-entries-in-multiple-tables-in-php, http : //stackoverflow.com/questions/2449132/run-mysql-insert-query-multiple-times-insert-values-into-multiplettables, http://stackoverflow.com/questions/3225024/mysql-insert- to-multiple-tables-relational, http://stackoverflow.com/questions/1582834/php-mysql-inserting-data-to-multiple-tables –

ответ

4

Сделка должна заканчиваться либо rollback() или commit(), (только один из них)

Его обычно используется с if...else заявление логически только один из них должен быть выполнен.

$dbConnect->beginTransaction(); 

//somecode 
//$dbConnect->execute($someInsert); 
//some more code 
//$result = $dbConnect->execute($someSelect); 
//$nextRow = $result->fetchRow(); 

//either commit or rollback! 
if($someResultCheck == true) 
    $dbConnect->commit(); 
else 
    $dbConnect->rollback(); 

Сделки, как правило, используется, когда существует сложная логика связан с запросами.

Если вы используете MySQL, убедитесь, что вы не используете механизм MyISAM для таблиц, так как он не поддерживает транзакции.

+0

поэтому мой код выше автоматического отката, если он не удается? – 2010-07-28 10:09:58

+0

Ваш код не гарантирует автоматический откат, если для параметра autoCommit установлено значение false –

+0

ok, так что мы должны сделать $ someResultCheck?, На RegisterInsert? я прав ? – 2010-07-28 10:50:48

4

Как только вы знаете, что сделка в целом происходит сбой, то вы должны откатить, что вы делали до сих пор и не попробовать какие-либо дополнительные обновления - так в псевдокоде:

function do_updates(array updates) 
{ 
    PDO->beginTransaction(); 
    foreach (updates as statement) { 
     run statement 
     if failed { 
     PDO->rollback(); 
     return false; 
     } 
    } 
    return PDO->commit(); 

НТН

C.

Смежные вопросы