Как исправить ошибку «Не удается запустить транзакцию # в сеансе» в рубиновом геме драйвера Монго - PullRequest
3 голосов
/ 05 апреля 2019

У меня есть приложение rails, которое я пытаюсь подключить к кластеру MongoDB Atlas (v3.6) через Mongoid.Я продолжаю сталкиваться с этой ошибкой:

[ERROR] Cannot start transaction 4 on session c6e79139-1be1-4c1c-9d13-a5e7ca45c792 - X6aX2zlpqRGB3UhpvFsz7wCO85u1m8A5+nkcYk7NDoM= because a newer transaction 30 has already started. (225)
[ERROR] /home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/operation/result.rb:267:in `raise_operation_failure'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/operation/result.rb:263:in `validate!'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/operation/shared/write.rb:42:in `execute'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/collection/view/writable.rb:307:in `block (2 levels) in update_one'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/retryable.rb:133:in `write_with_retry'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/collection/view/writable.rb:295:in `block in update_one'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/cluster.rb:655:in `with_session'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/client.rb:662:in `with_session'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/collection/view.rb:204:in `with_session'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/mongo-2.7.0/lib/mongo/collection/view/writable.rb:294:in `update_one'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/query_cache.rb:182:in `update_one_with_clear_cache'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/updatable.rb:144:in `block in update_document'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/updatable.rb:118:in `block (2 levels) in prepare_update'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:117:in `call'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:505:in `call'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:778:in `_run_update_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:81:in `run_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/interceptable.rb:138:in `run_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/updatable.rb:117:in `block in prepare_update'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:117:in `call'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:505:in `call'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:778:in `_run_save_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/gems/activesupport-4.2.11/lib/active_support/callbacks.rb:81:in `run_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/interceptable.rb:138:in `run_callbacks'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/updatable.rb:116:in `prepare_update'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/updatable.rb:139:in `update_document'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/persistable/savable.rb:25:in `save'
/home/dev/.rvm/gems/ruby-2.4.4@myproj/bundler/gems/mongoid-9afa64b7b0c0/lib/mongoid/relations/proxy.rb:151:in `method_missing'
...

Мы не делаем явного управления транзакциями и работали без проблем на кластере Compose MongoDB (v3.0.11).Также кажется, что он корректно работает с MongoDB Atlas v3.4.20.

Вот конфиг, вызывающий проблему:

  • Кластер MongoDB Atlas: 3.6.11
  • Mongoдрагоценный камень: 2.7.0
  • Mongoid: 5.4.0
  • Рельсы: 4.2.11
  • Рубин: 2.4.4

С тем жеconfig, но с использованием кластера Compose MongoDB 3.0.11, все работает нормально.

Я подозреваю, что проблема связана с изменением в Mongo 3.6 логических сессий, но не может найти в Mongoid нигде, который будет создавать транзакции.

Мой mongoid.yml выглядит так:

    production:
      clients:
        default:
          uri: <%= ENV['MONGODB_URI'] %>

и

    MONGODB_URI="mongodb://USERNAME:PASSWORD@cluster0-shard-00-00-xxxxx.mongodb.net:27017,cluster0-shard-00-01-xxxxx.mongodb.net:27017,cluster0-shard-00-02-xxxxx.mongodb.net:27017/db-name?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...