2016-12-23 12 views
2

Normall、DB::beginTransaction()を使用した場合、それはこのようなDB::rollBack()laravel5でDB :: commit()を使わずにDB :: beginTransactionを呼び出すとどうなりますか?

何かで使用されています

DB::beginTrnsaction(); 
try { 
    DB::insert(...); 
    DB::insert(...); 
    DB::insert(...); 

    DB::commit(); 
    // all good 
} catch (\Exception $e) { 
    DB::rollback(); 
    // something went wrong 
} 

しかし、私はトライキャッチループを追加するために何を忘れた場合?

すなわち

DB::beginTrnsaction(); 
DB::insert(...); 
DB::insert(...); 
DB::insert(...); 
DB::commit(); 

、インサートの一つがうまくいかない場合は、データベースが変更されますか?または自動的にロールバックされますか?概念を理解するために

+3

挿入クエリのいずれかでエラーが発生した場合、トランザクションは自動的にロールバックされます。 –

+0

はい、自動的にロールバックされます –

+1

これはテストケースを作成して自分自身でテストできます。 –

答えて

1

トランザクションを開始してもコミットまたはロールバックしないと、データベースへの接続が閉じられると、トランザクションは自動的にロールバックされます。

ほとんどのPHPページでは、要求が完了すると通常は接続が閉じられるため、これは大きな問題ではありません。

ただし、永続的な接続を使用している場合は問題になります。永続的な接続では、要求の完了時にデータベースへの接続が終了しません。接続は、接続プールに戻って、生きていると、よく、トランザクションはまだ開いています。トランザクションがまだ開いていれば、レコードのロックはまだ有効です。これにより、接続が終了し、不正なトランザクションがロールバックされるまで、後続のリクエストでこれらのレコードへのアクセスがブロックされる可能性があります。

トランザクションの場合、トランザクションのライフタイムが短ければ短いほど良いです。トランザクションは、作業単位を完了するのに十分な長さで生き残るためには望みますが、それ以上の期間は生き残ることは望ましくありません。トランザクションを完了するためにコミットまたはロールバックできるとすぐに、他のプロセスがそれらのレコードをロックするのに必要な時間が短くなります。これは本当に大量のサイトに影響する可能性があります。

あなた自身の責任を取り除くためにできることの1つはClosureの中であなたの仕事をtransaction()メソッドに渡すことです。これにより、トランザクションの開始とコミット/ロールバックが自動的に処理されます。任意のExceptionClosure内部でスローされた場合

DB::transaction(function() { 
    DB::insert(...); 
    DB::insert(...); 
    DB::insert(...); 
}); 

、トランザクションはロールバックされます。それ以外の場合、トランザクションはコミットします。

+1

私のトランザクションは多くの変数に依存しており、 'use()'や 'global'に変数のリストをコピーする必要があるので、closureを使用することは失礼です。私は私の場合にtry catchアプローチを好むだろう。 – cytsunny

+0

@cytsunny配列に変数を代入し、配列を 'use($ your_array)' ... – Kyslik

+0

try catchが問題を解決するときに変数を割り当てる理由は何ですか? – cytsunny

0

試してみてください。

はTRANSACTIONはBEGIN - >あなたのコード

if($condition) 
{ 
    // ROLLBACK 
} 
else 
{ 
    // COMMIT 
} 

ROLLBACKは、すべての変更を元に戻す意味DB

の最後から構成された状態から開始します最後の一貫性のある状態からやり直しています。

COMMITは、すべてのことが問題なく、変更を保存して永続化させることを意味します。

注:コミットしないとすべての変更が破棄されます。

+0

私は彼らが何のためにいるのか理解しています....自動的にロールバックされるかどうか、なぜ人々が試してみてください。 – cytsunny

関連する問題