gko*_*ban 5 ruby-on-rails mongodb mongoid mongodb-atlas
我有一个Rails应用程序,试图通过Mongoid连接到MongoDB Atlas集群(v3.6)。我一直遇到这个错误:
[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'
...
Run Code Online (Sandbox Code Playgroud)
我们没有进行任何明确的事务管理,并且在Compose MongoDB集群(v3.0.11)上运行时没有出现问题。它似乎也可以与MongoDB Atlas v3.4.20一起正常工作。
这是引起问题的配置:
使用相同的配置,但使用Compose MongoDB 3.0.11集群,一切正常。
我怀疑问题与Mongo 3.6中逻辑会话的更改有关,但是在Mongoid中找不到可以创建事务的任何地方。
我的mongoid.yml看起来像这样:
production:
clients:
default:
uri: <%= ENV['MONGODB_URI'] %>
Run Code Online (Sandbox Code Playgroud)
和
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"
Run Code Online (Sandbox Code Playgroud)
小智 3
在过去的几个小时里,我一直在努力反对这个问题。我找到了两种可能的解决方案/建议:
1.) 在连接字符串中将 retryWrites 设置为“false”。我无法找到任何迹象表明为什么这可以解决问题,但我在 2 个不同的非 MongoDB 官方文档中看到了它。请注意,在最新版本的 Mongo 中默认启用 retryWrites,这是毫无疑问的,因此在关闭该功能之前请考虑到这一点。
2.) 如果您使用分叉网络服务器(Unicorn、Puma、Passenger 等),请确保在分叉后创建新的客户端连接。与几乎所有与 Mongoid 相关的内容一样,有关实现这一目标的推荐方法的文档很少,而且我至少看到过一篇文档似乎表明这实际上并不是必要的。同样,您的里程可能会有所不同。
只是想我会发布这个答案,以防任何一个建议碰巧对将来的某人有用。我无法保证任何建议的准确性/有效性。我已经尝试过解决方案#2,但还无法在愤怒中测试它,所以我不知道它是否有帮助。
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |