Где откатить транзакцию в PDO? - PullRequest
6 голосов
/ 28 июля 2010

моя проблема в том, что у меня есть дизайн базы данных по этой ссылке перегружена ли моя база данных?

edit * 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();

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 28 июля 2010

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

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

НТН

С

5 голосов
/ 28 июля 2010

Транзакция должна заканчиваться либо 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 для таблиц, так как он не поддерживает транзакции.

...