Fix "1305 SAVEPOINT trans2 does not exist" in Laravel
Understanding “1305 SAVEPOINT trans2 does not exist”
Have you ever encountered the “1305 SAVEPOINT trans2 does not exist” error in production or while running your Laravel tests?
I have no clue if it’s a common issue, but it can be pretty puzzling, especially when it appears unexpectedly.
The error “1305 SAVEPOINT trans2 does not exist” typically pops up in Laravel applications using MySQL during database transactions.
One of the primary causes of this error is nested transactions (when a transaction is started within another transaction). You may have forgotten to commit or roll back a transaction and started a new one. MySQL cannot do that.
Potential fixes for “1305 SAVEPOINT trans2 does not exist”
- I double-checked that I wasn’t actually nesting transactions. For instance, I started logging all database queries occurring during my tests by using
DB::enableQueryLog()
andDB::getQueryLog()
. In my case, this confirmed there were no nested transactions. So, step two may also be the answer for you. - Since I encountered “1305 SAVEPOINT trans2 does not exist” while running my tests, modifying how the database was managed was effective. I started using the
Illuminate\Foundation\Testing\RefreshDatabase
trait instead of theIlluminate\Foundation\Testing\LazilyRefreshDatabase
trait. Please don’t ask me why; I have no idea. 😅