2010-07-28 4 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

그래 내가 거래 일을해야 조금 혼란 메신저 ... 네 말을? (나는 그것을 사용한 적이 없다) 아니면 그냥 이것이나 좋아하는 것일까 요? 또는 내가 놓칠 수있는 다른 의견을 남길 수 감사 파스칼 :) 가능한 복제본 –

+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-multiple-tables, 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

내 코드가 자동 롤백 위의 코드라면 실패합니다. –

+0

autoCommit이 false로 설정되어 있지 않으면 코드가 자동으로 롤백되는 것이 보장되지 않습니다. –

+0

ok 그렇다면 RegisterInsert에서 $ someResultCheck를 수행해야합니까? 내가 맞습니까? –

4

즉시이 전체 트랜잭션이 당신이 더 이상 업데이트를하려고 지금까지 한 일을 롤백하고 안 후 실패 할 것이라는 것을 알고있다 - 의사 코드에 있도록 :

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

HTH

C.

관련 문제