2016-11-23 88 views

答えて

2

がコミットされていないトランザクションは、SQLに破棄されます。

ここで例外をスローすると、DB::commit()に到達することはありません。 catch()ブロックにまっすぐ進むので、トランザクションは破棄されます(DB::commit()が後で呼び出されない限り)。

ただし、例外がスローされたときにトランザクションをコミットしたくない場合は、catchブロックでトランザクションを明示的にロールバックすることをお勧めします。これはトランザクションを終了し、その実行。

try { 
    DB::beginTransaction(); 
    throw new Exception("something happened"); 
    DB::commit() 
} catch (Exception $e) { 
    Log::debug("something bad happened"); 
    DB::rollBack(); 
} 

または例外がここに文書化され、捕捉されなかったときに自動的にロールバックするために閉鎖して構築されたDBで::トランザクションを()を使用しますhttps://laravel.com/docs/5.3/database#database-transactions

+0

ありがとうございました。それはトランザクションを保持し、何らかのクリーンアッププロセスを持っていますか? – timbroder

+0

スクリプトは、スクリプトの実行が終了するまで開いたままにします。その時点で、そのトランザクションを終了/破棄するクリーンアッププロセスが実行されます。そのため、例外がスローされたときにトランザクションを明示的にロールバックすることを推奨しました。 – Devon

+0

Db :: commitを使用して、成功した場合に何かをエコーすることができます –

2

あなたが閉鎖に使用している場合は、のように:

DB::transaction(function() { 
    DB::table('users')->update(['votes' => 1]); 
    DB::table('posts')->delete(); 
}); 

あなたは、フレームワークの内部でこのコードを実行します:

public function transaction(Closure $callback) 
{ 
    $this->beginTransaction(); 

    // We'll simply execute the given callback within a try/catch block 
    // and if we catch any exception we can rollback the transaction 
    // so that none of the changes are persisted to the database. 
    try { 
     $result = $callback($this); 

     $this->commit(); 
    } 

    // If we catch an exception, we will roll back so nothing gets messed 
    // up in the database. Then we'll re-throw the exception so it can 
    // be handled how the developer sees fit for their applications. 
    catch (Exception $e) { 
     $this->rollBack(); 

     throw $e; 
    } catch (Throwable $e) { 
     $this->rollBack(); 

     throw $e; 
    } 

    return $result; 
} 

ので、目にその場合、トランザクションがロールバックされることを100%確信しています。あなたはDB::beginTransaction();とのトランザクションを手動で開くと、それはあなたのような何かを確認していない限り、ロールバックしようとしていることを確認しする方法はありません。

try { 
    DB::beginTransaction(); 
    //do something 
    DB::commit(); 
} catch (\Exception $e) { 
    DB::rollback(); 
} 

あなたがキャッチせずに例外をスローした場合、スクリプトが死ぬかで終わりますトランザクションを開いて、PDOは自動的に(http://php.net/manual/en/pdo.transactions.php)をロールバックします:

スクリプトが終了した場合や、接続があなたが優秀なトランザクションを持っている場合、PDOはそれを自動的にロールバックされます、閉じれようとしているとき。

関連する問題