2017-01-11 16 views
2

私はマルチクエリを行ったときにdbトランザクションを作成しようとしました。DB :: transactionでエラーが発生した場合、Laravel 5.3はロールバックされませんでしたか?

とも私はロールバックされないように、ここで投げいくつかの例外は、トランザクションが思えるときだけ

DB::transaction(function() { 
    try{ 
     //....db queries 
    }catch(\Exception $e){ 
     Log::info($e); 
    } 
}); 

のようなトランザクション外の例外をキャッチしようとしたが、データはデータベースに変更されました。

私は手動でcatchステートメントでDB::rollBack()を行う場合は、すべて私のデータは、罰金になり、

それは私が手動でDB::rollBack()をしなければならないなら、私は思うのですか?

私はDB::transactionを使用している場合、例外が投げられたときに、DB::rollBack()が自動的に実行されると私のdbクエリを管理すると言ったことを覚えていますか?

Laravel 5.3で変更されましたか?

+0

また、あなたの質問をより明確にするための適切なコードを示してください。 – msonowal

+0

@msonowal私はちょうどDB :: transactionのロジックについて、正確なコードについては議論したいと思います。あなたがLaravelを知っているなら、私が何を話しているのかを理解するのは簡単です。だから、私のポイントを明確にするためにたくさんのコードを入力する必要はないと思います。 –

答えて

2

これに続いてlinkDB::transaction()は使用しないでください。代わりにDB::beginTransactionDB::commit/DB::rollback()

でこのコードを使用してください。

+0

私はDB :: transactionではなくDB :: beginTransactionを使うべきかどうか?はいの場合、DB ::トランザクションが使用されますか? DB :: transactionが不要なようです。 –

+0

@AbelLee:トランザクションを手動で開始し、ロールバックとコミットを完全に制御したい場合は、 'beginTransaction'メソッド、[Docs](https://laravel.com/docs/5.3/database#database - トランザクション)。 –

+0

私はトランザクションの例外をキャッチしたいだけでなく、トランザクションの原点の振る舞いも実行されます。すべての取引が正しいとは限りません。もしそうなら、DB :: transactionはDB :: beginTransactionよりもあまり良くありません –

0

あなたがそのように実装している場合、それは 、自動的に実行されることはありませんが、あなたは

DB::transaction(function() { 
    //db queries 
}); 

以下のような閉鎖としてそれを使用する場合は、自動的にロールバックされます。

+0

私はあなたが投稿したように、DB :: rollBack()を実行するかどうかわからなくても、DB :: transactionでいくつかの例外が発生した場合、 "500"エラーコードを投げ捨てます。だから私は例外を快適にするために "try ... catch"をラップしたいと思う。そして、私がこれを行うと、私はDB :: rollBack()を手動で行う必要があることを発見しました。( –

+1

はい、あなたがするはずのものです – msonowal

2

あなたがお互い.ITに応じた複数のテーブルエントリと更新をお持ちの場合は、詳細については成功した

は、ドキュメントを参照してくださいするとき

$var_name = DB::transaction(function() { 
// DB operations..... 
}); 

の$ VAR_NAMEはnullを返したトランザクションを使用することをお勧めしますhttps://laravel.com/docs/5.3/database

希望がこれを助けます。 取引で任意のクエリ

+0

あなたは何を得ているのですか? –

+0

アドバンスドで感謝しています。 DB :: transactionとDB :: rollBack()は、通常のトランザクション方法で実行されますが、私は手動でキャッチしようとしましたが、彼らは言及しませんでした –

+0

私はDBトランザクションで作業していたため、別のエラーが発生する可能性があります。一度だけキャッチしてみてください。 –

0

にする場合には適切な方法を問い合わせて、try/catchは、このようなものです:

try { 
    DB::transaction(function(){ 
     //your query stuff here 
    }); 

    DB::commit(); //transactions had no error 
} catch (\Exception $e) { 
    //transactions had an error 
    DB::rollback(); 

    //do something with $e->getMessage(); 
} 

目的は、あなたのクエリが失敗した場合に大きなコントロールを与えることです。これにより、例外をキャッチしてトランザクションをロールバックできます。それ以外の場合は、トランザクションを実行するだけです。

関連する問題