We all use DB::transaction()
for multiple insert queries. In doing so, should a try...catch
be placed inside it or wrapping it? Is it even necessary to include a try...catch
when a transaction will automatically fail if something goes wrong?
Sample try...catch
wrapping a transaction:
// try...catch try { // Transaction $exception = DB::transaction(function() { // Do your SQL here }); if(is_null($exception)) { return true; } else { throw new Exception; } } catch(Exception $e) { return false; }
The opposite, a DB::transaction()
wrapping a try…catch:
// Transaction $exception = DB::transaction(function() { // try...catch try { // Do your SQL here } catch(Exception $e) { return $e; } }); return is_null($exception) ? true : false;
Or simply a transaction w/o a try…catch
// Transaction only $exception = DB::transaction(function() { // Do your SQL here }); return is_null($exception) ? true : false;
Advertisement
Answer
In the case you need to manually ‘exit’ a transaction through code (be it through an exception or simply checking an error state) you shouldn’t use DB::transaction()
but instead wrap your code in DB::beginTransaction
and DB::commit
/DB::rollback()
:
DB::beginTransaction(); try { DB::insert(...); DB::insert(...); DB::insert(...); DB::commit(); // all good } catch (Exception $e) { DB::rollback(); // something went wrong }
See the transaction docs.