Skip to content

Nested transactions are not supported by this client. #232

@matthewjumpsoffbuildings

Description

When I upgraded from v7 to v8 of this driver, I found that suddenly code that worked fine in v7 is now throwing the "Nested transactions are not supported by this client." error from google/cloud-spanner/src/Database.php:912

I know that in the ManagesTransactions trait there is the following block

 // Since Cloud Spanner does not support nested transactions,
        // we use Laravel's transaction management for nested transactions only.
        if ($this->transactions > 0) {
            return parent::transaction($callback, $attempts);
        }

Which I would assume is supposed to stop nested transaction calls from throwing the error I am getting, and in v7 it does seem to work, but something has changed in v8 that is making it no longer work?

I know its probably hard to debug without a demo repository, but I am hoping you have a some idea what might have changed with transaction handling from v7 to v8 that might be causing this

If it is helpful here is the error and call stack

 Nested transactions are not supported by this client. {"userId":"03faf8f5-0dde-4c65-bc4e-52f823b6e69e","exception":"[object] (BadMethodCallException(code: 0): Nested transactions are not supported by this client. at /vendor/google/cloud-spanner/src/Database.php:912)
[stacktrace]
#0 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(76): Google\\Cloud\\Spanner\\Database->runTransaction(Object(Closure), Array)
#1 /vendor/colopl/laravel-spanner/src/Connection.php(555): Colopl\\Spanner\\Connection->Colopl\\Spanner\\Concerns\\{closure}()
#2 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(75): Colopl\\Spanner\\Connection->withSessionNotFoundHandling(Object(Closure))
#3 /vendor/colopl/laravel-spanner/src/Connection.php(346): Colopl\\Spanner\\Connection->transaction(Object(Closure))
#4 /vendor/laravel/framework/src/Illuminate/Database/Connection.php(536): Colopl\\Spanner\\Connection->affectingStatement('update `media` ...', Array)
#5 /vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3859): Illuminate\\Database\\Connection->update('update `media` ...', Array)
#6 /vendor/colopl/laravel-spanner/src/Query/Builder.php(63): Illuminate\\Database\\Query\\Builder->update(Object(Illuminate\\Support\\Collection))
#7 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1115): Colopl\\Spanner\\Query\\Builder->update(Array)
#8 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1238): Illuminate\\Database\\Eloquent\\Builder->update(Array)
#9 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1155): Illuminate\\Database\\Eloquent\\Model->performUpdate(Object(Illuminate\\Database\\Eloquent\\Builder))
#10 /vendor/spatie/laravel-medialibrary/src/MediaCollections/Models/Media.php(515): Illuminate\\Database\\Eloquent\\Model->save()
#11 /vendor/spatie/laravel-medialibrary/src/MediaCollections/Models/Media.php(293): Spatie\\MediaLibrary\\MediaCollections\\Models\\Media->saveOrTouch()
#12 /vendor/spatie/laravel-medialibrary/src/Conversions/Actions/PerformConversionAction.php(49): Spatie\\MediaLibrary\\MediaCollections\\Models\\Media->markAsConversionGenerated('thumb')
#13 /vendor/spatie/laravel-medialibrary/src/Conversions/FileManipulator.php(71): Spatie\\MediaLibrary\\Conversions\\Actions\\PerformConversionAction->execute(Object(Spatie\\MediaLibrary\\Conversions\\Conversion), Object(App\\Models\\Media), '/Users/matt/Dev...')
#14 /vendor/laravel/framework/src/Illuminate/Collections/Traits/EnumeratesValues.php(257): Spatie\\MediaLibrary\\Conversions\\FileManipulator->Spatie\\MediaLibrary\\Conversions\\{closure}(Object(Spatie\\MediaLibrary\\Conversions\\Conversion), 0)
#15 /vendor/spatie/laravel-medialibrary/src/Conversions/FileManipulator.php(70): Illuminate\\Support\\Collection->each(Object(Closure))
#16 /vendor/spatie/laravel-medialibrary/src/Conversions/Jobs/PerformConversionsJob.php(29): Spatie\\MediaLibrary\\Conversions\\FileManipulator->performConversions(Object(Spatie\\MediaLibrary\\Conversions\\ConversionCollection), Object(App\\Models\\Media), false)
#17 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob->handle(Object(Spatie\\MediaLibrary\\Conversions\\FileManipulator))
#18 /vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#19 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))
#20 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
#21 /vendor/laravel/framework/src/Illuminate/Container/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
#22 /vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(128): Illuminate\\Container\\Container->call(Array)
#23 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Bus\\Dispatcher->Illuminate\\Bus\\{closure}(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob))
#24 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob))
#25 /vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(132): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#26 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(124): Illuminate\\Bus\\Dispatcher->dispatchNow(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob), false)
#27 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Queue\\CallQueuedHandler->Illuminate\\Queue\\{closure}(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob))
#28 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob))
#29 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(123): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#30 /vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(71): Illuminate\\Queue\\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\\Queue\\Jobs\\SyncJob), Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob))
#31 /vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(102): Illuminate\\Queue\\CallQueuedHandler->call(Object(Illuminate\\Queue\\Jobs\\SyncJob), Array)
#32 /vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(76): Illuminate\\Queue\\Jobs\\Job->fire()
#33 /vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(52): Illuminate\\Queue\\SyncQueue->executeJob(Object(Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob), '', '')
#34 /vendor/laravel/framework/src/Illuminate/Database/DatabaseTransactionRecord.php(69): Illuminate\\Queue\\SyncQueue->Illuminate\\Queue\\{closure}()
#35 /vendor/laravel/framework/src/Illuminate/Collections/HigherOrderCollectionProxy.php(65): Illuminate\\Database\\DatabaseTransactionRecord->executeCallbacks()
#36 [internal function]: Illuminate\\Support\\HigherOrderCollectionProxy->Illuminate\\Support\\{closure}(Object(Illuminate\\Database\\DatabaseTransactionRecord), 1)
#37 /vendor/laravel/framework/src/Illuminate/Collections/Arr.php(605): array_map(Object(Closure), Array, Array)
#38 /vendor/laravel/framework/src/Illuminate/Collections/Collection.php(789): Illuminate\\Support\\Arr::map(Array, Object(Closure))
#39 /vendor/laravel/framework/src/Illuminate/Collections/HigherOrderCollectionProxy.php(64): Illuminate\\Support\\Collection->map(Object(Closure))
#40 /vendor/laravel/framework/src/Illuminate/Database/DatabaseTransactionsManager.php(96): Illuminate\\Support\\HigherOrderCollectionProxy->__call('executeCallback...', Array)
#41 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(178): Illuminate\\Database\\DatabaseTransactionsManager->commit('spanner-emulato...', 1, 0)
#42 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(94): Colopl\\Spanner\\Connection->performSpannerCommit()
#43 [internal function]: Colopl\\Spanner\\Connection->Colopl\\Spanner\\Concerns\\{closure}(Object(Google\\Cloud\\Spanner\\Transaction))
#44 /vendor/google/cloud-spanner/src/Database.php(968): call_user_func(Object(Closure), Object(Google\\Cloud\\Spanner\\Transaction))
#45 [internal function]: Google\\Cloud\\Spanner\\Database->Google\\Cloud\\Spanner\\{closure}(Object(Closure), Object(Google\\Cloud\\Spanner\\Session\\Session), Array)
#46 /vendor/google/cloud-core/src/Retry.php(80): call_user_func_array(Object(Closure), Array)
#47 /vendor/google/cloud-spanner/src/Database.php(986): Google\\Cloud\\Core\\Retry->execute(Object(Closure), Array)
#48 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(76): Google\\Cloud\\Spanner\\Database->runTransaction(Object(Closure), Array)
#49 /vendor/colopl/laravel-spanner/src/Connection.php(555): Colopl\\Spanner\\Connection->Colopl\\Spanner\\Concerns\\{closure}()
#50 /vendor/colopl/laravel-spanner/src/Concerns/ManagesTransactions.php(75): Colopl\\Spanner\\Connection->withSessionNotFoundHandling(Object(Closure))
#51 /vendor/laravel/nova/src/Http/Controllers/ResourceUpdateController.php(37): Colopl\\Spanner\\Connection->transaction(Object(Closure))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions