MongoError: Việc triển khai MongoDB này không hỗ trợ ghi lại. Vui lòng thêm retryWrites = false vào chuỗi kết nối của bạn


10

Tôi đang sử dụng "mongoose": "^5.7.1"trong dự án Node.js của mình. Tôi đang thực hiện một api liên quan đến việc cập nhật trong hai tài liệu. Vì vậy, tôi đang sử dụng các giao dịch như sau:

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

Khi tôi nhấn api này trên môi trường cục bộ của mình, tôi gặp lỗi sau:

MongoError: Việc triển khai MongoDB này không hỗ trợ ghi lại. Vui lòng thêm retryWrites = false vào chuỗi kết nối của bạn.

Khi tôi nhấn api này trên môi trường từ xa, thì nó chạy tốt. Tôi đang sử dụng https://www.clever-cloud.com làm đám mây cơ sở dữ liệu và AWS làm đám mây api.

Như đã viết trong thông báo lỗi, tôi đã cố gắng đặt retryWrites=false

  • ở cuối chuỗi kết nối mà tôi chuyển đến cầy mangut mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • với các tùy chọn như retryWrites: falseđược truyền cho mongoose.connectphương thức.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Không có điều nào ở trên giải quyết được vấn đề.

Dưới đây là đầu ra của mongo --versionlệnh:

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

Tôi đã gỡ lỗi và tìm thấy lỗi thực sự đằng sau việc ném lỗi này là:

MongoError: Số giao dịch chỉ được phép trên một thành viên bản sao hoặc mongos

Xin đề nghị một cái gì đó.


Tôi bắt đầu thấy những lỗi này là tốt. Tôi đang sử dụng Mlab trên Heroku. Nhưng thêm tùy chọn trên máy khách đã giải quyết điều này. Tôi vừa thử phiên bản URI và nó cũng hoạt động. Lạ thật.
Di chuyển

Tôi đang sử dụng một máy chủ độc lập và điều đó gây ra lỗi này. Lỗi ban đầu không phải là thực tế và lỗi sau có thể được giải quyết bằng cụm sao chép hoặc cụm được chia sẻ. Xem npmjs.com/package/run-rs
Nhà phát triển Andro

Câu trả lời:


2

Giao dịch chắc chắn là tính năng mới thú vị nhất trong MongoDB 4.0. Nhưng thật không may, hầu hết các công cụ để cài đặt và chạy MongoDB đều khởi động một máy chủ độc lập chứ không phải là một bộ bản sao. Nếu bạn cố gắng bắt đầu một phiên trên máy chủ độc lập, bạn sẽ gặp lỗi này.

Vấn đề này có thể được giải quyết bằng cách sử dụng các bộ bản sao trên môi trường địa phương của bạn.

Tôi đã sử dụng run-rs cho mục đích này.


2

Như được đề xuất trong câu trả lời được chấp nhận, bạn cần phải chạy máy chủ cục bộ của mình dưới dạng bản sao để có thể thực hiện các giao dịch, trái ngược với máy chủ độc lập.

Tuy nhiên, ngoài giải pháp được đề xuất, bạn có thể dễ dàng chuyển đổi db cục bộ độc lập của mình sang Bộ bản sao mà không cần sử dụng bất kỳ công cụ của bên thứ ba nào , bằng cách làm theo các hướng dẫn trong tài liệu MongoDB , được tóm tắt như sau:

  1. Dừng cá thể mongod độc lập của bạn và khởi động lại nó với replSetđối số.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Kết nối với phiên bản của bạn bằng một trình mongobao và khởi tạo Bộ bản sao mới.
rs.initiate()

Bây giờ bạn nên có Bộ bản sao thay vì máy chủ mongodb độc lập, nơi bạn có thể thực hiện các giao dịch trên môi trường cục bộ của mình để cập nhật nhiều tài liệu cùng một lúc!

Đừng quên bao gồm replSetđối số mỗi khi bạn muốn khởi động máy chủ, nếu không nó sẽ được bắt đầu dưới dạng Độc lập. Tôi chỉ đơn giản sử dụng lệnh tương tự như trong bước 1 để chạy lại nó.


Ngoài ra, bạn có thể triển khai Bộ bản sao mới từ đầu để kiểm tra môi trường theo các hướng dẫn khác trong tài liệu MongoDB.


0

Vui lòng chỉnh sửa App/Config/databasetập tin Thêm 'retryWrites'=>falsevào chuỗi kết nối Mongodb

viết kết nối db Mongo

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

Lưu và chạy


0

Vui lòng thử thêm &retryWrites=falsevào chuỗi kết nối của bạn

-

Tôi thực sự đã gặp các lỗi được đề cập trong OP khi kết nối với máy chủ db từ xa của chúng tôi, trong khi nó đang hoạt động cục bộ. Tôi đã liên hệ với bộ phận hỗ trợ lưu trữ mongo của chúng tôi trước khi thử đề xuất bị lỗi.

-

Đây là những gì trang web mongo được lưu trữ của chúng tôi (mLab) cho biết:

Có khả năng trình điều khiển ứng dụng của bạn đã được cập nhật lên phiên bản mới hơn đang cố gắng sử dụng tính năng chỉ có WiredTiger. Như lỗi đề cập, bạn sẽ cần thêm & retryWrites = false vào chuỗi kết nối của mình.

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-stcharge-engines-that-support-document-level-locking-error

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.