2013-03-25 43 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{} 



//程序性的將是簡單的解決方法

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 2013-03-25 06:24:45

回答

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(); 
} 
+0

是的,但每個操作都在單獨的模型中。 – 2013-03-25 06:31:07

+0

對不起,你只需要傳遞'$ pdo'的引用來做 – doublesharp 2013-03-25 06:32:23

+0

看起來像? 'beginTransaction | $ MODEL_A :: insert()| $ MODEL_B :: insert()|提交' – 2013-03-25 06:35:22