2016-01-20 140 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()都会在失败时回滚,那么要测试你的代码而不用回滚。 –