2013-10-14 174 views
1

Yii的交易不會保存在DB下面的示例代碼和記錄回滾:Yii的交易doen't回滾

 $transaction = Yii::app()->db->beginTransaction(); 
     $mode_1 = new Orders; 
     $mode_1->id_order = 3333; 
     $mode_1->AWB = 3333; 
     $mode_2 = new Orders; 
     $mode_2->id_order = 4444; 
     $mode_2->AWB = 4444; 
     $mode_2->save(); 
     $mode_1->save(); 
    $transaction->rollback(); 

什麼想法? ..謝謝

+0

的可能重複[交易並不Yii中工作(http://stackoverflow.com/questions/13789965/transaction-doesnt-work-in-yii) – trejder

回答

5

請確保您的表的存儲引擎是InnoDB。我相信這是默認情況下唯一可用的事務安全引擎。更多關於mysql docs的可用引擎

+0

是它現在可以正常使用。我將我的表引擎從MyISAM更改爲InnoDB ..謝謝你的建議:) – hishamaborobnaser

+0

你也救了我。像魅力一樣工作 – Turikumwe

11

使用事務的正確方法是將它們與try-catch結構一起使用。在你的例子中,我認爲問題來了,因爲你沒有做提交($ transaction-> commit())。

$transaction = Yii::app()->db->beginTransaction(); 
try { 
    if (!$model->save()) { 
     throw new Exception('Model cannot be saved.'); 
    } 
    if (!$anothermodel->save()) { 
     throw new Exception('Anothermodel cannot be saved.'); 
    } 

    $transaction->commit(); 
} catch (Exception $e) { 
    $transaction->rollback(); 
} 

編輯: $模型 - >保存()不會拋出異常,所以你需要把它扔!

+0

其實把try-catch不起作用或改變任何東西。 – hishamaborobnaser

+0

但在這種情況下,您不能擁有保存模型,在同一時間提交事務和回滾事務。將數據成功保存到數據庫和數據以回滾事務之後,這很奇怪。 – eXtreme

+1

雖然這個答案可能沒有解決你的問題,但是這個答案正在教導做交易的正確方式。這是在那裏投票的理由! –