2016-01-20 42 views
0

我有以下代碼:Laravel DB ::交易例外PDO沒有活動事務

$new_models = DB::transaction(function() use ($supplier, $address, $addressDetail) {    
     $new_supplier = $this->setNewSupplier($supplier); 
     $new_address = $this->setNewAddress($address);   
     $new_addressDetail = $this->setNewAddressDetail($addressDetail,$new_address->id);   
     $this->syncSupplierAddress($new_supplier->id,$new_address->id); 
     $this->updateControlAp($new_supplier->supplier_id); 
     return [$new_supplier, $new_address, $new_addressDetail]; 
    }); 

設定方法基本上創建模型與保存()結尾對象; 現在,如果第二個...第n個失敗,這工作得很好,但如果第一個失敗,則不會。 如果$this->setNewSupplier($supplier); 失敗比我得到

"PDOException in Connection.php line 541: 
There is no active transaction" 

難道我做錯了什麼嗎?另外,如果我從供應商Connection.php中捕獲的$this->rollBack();發表評論,它實際上給了我SQL錯誤。這裏的重要部分是,僅當首次保存()失敗時纔會工作。

PS。我使用PostgreSQL的不是MySQL,但我不認爲它相關

回答

0

有不同的方式,使交易Laravel,另外一個可能是這樣的:

... 
$new_models = []; 
try { 
    DB::beginTransaction(); 

    $new_supplier = $this->setNewSupplier($supplier); 
    $new_address = $this->setNewAddress($address);   
    $new_addressDetail = $this->setNewAddressDetail($addressDetail,$new_address->id);   
    $this->syncSupplierAddress($new_supplier->id,$new_address->id); 
    $this->updateControlAp($new_supplier->supplier_id); 
    $new_models = [$new_supplier, $new_address, $new_addressDetail]; 

    DB::commit(); 
} catch(\Exception $e) { 
    DB::rollback(); 
    // Handle Error 
} 
... 
+0

我想你的代碼,它仍然行爲相同辦法。如果我使用 'catch(\ Exception $ e){ // DB :: rollback(); 扔$ e; }'我得到的錯誤,但如果我取消註釋回滾仍PDO:沒有活動事務如果第一次保存()失敗。我實際上認爲save()方法會回滾。如果實際上每次調用save()都會在失敗時回滾,那麼要測試你的代碼而不用回滾。 –