Reputation: 885
I have used DB::transaction
function in my controller like this,
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
});
}
I want to know the way I have used the function is ok and i need to verify is it working correctly?
Upvotes: 4
Views: 5262
Reputation: 11083
As the documentation illustrate you have two choices :
Closure
:You may use the
transaction
method on theDB
facade to run a set of operations within a database transaction. If an exception is thrown within the transactionClosure
, the transaction will automatically be rolled back. If theClosure
executes successfully, the transaction will automatically be committed. You don't need to worry about manually rolling back or committing while using thetransaction
method
DB::transaction(function () {
// Interacting with the database
DB::insert(...);
DB::insert(...);
DB::insert(...);
});
If you would like to begin a transaction manually and have complete control over rollbacks and commits, you may use the beginTransaction method on the DB facade:
DB::beginTransaction();
You can rollback the transaction via the rollBack method:
DB::rollBack();
Lastly, you can commit a transaction via the commit method:
DB::commit();
The manually use of the transactions is linked to the try catch
block like this :
DB::beginTransaction();
try {
// Interacting with the database
DB::insert(...);
DB::insert(...);
DB::insert(...);
DB::commit(); // Commiting ==> There is no problem whatsoever
} catch (\Exception $e) {
DB::rollback(); // rollbacking ==> Something went wrong
}
For testing the transaction you can run your example without throwing any exception ==> expected result : all fine the Plant will be created.
And if you throw an exception the transaction will be rollbacked and the Plant will not be created in the database :
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
throw new ModelNotFoundException("Just for testing :)");
});
}
Add use Illuminate\Database\Eloquent\ModelNotFoundException;
at the top of the controller ;)
Upvotes: 5