MongoError: การปรับใช้ MongoDB นี้ไม่รองรับการเขียนซ้ำได้ โปรดเพิ่ม retryWrites = false ในสตริงการเชื่อมต่อของคุณ


10

ฉันใช้"mongoose": "^5.7.1"ในโครงการ Node.js ของฉัน ฉันกำลังทำ API ซึ่งเกี่ยวข้องกับการปรับปรุงในสองเอกสาร ดังนั้นฉันใช้ธุรกรรมดังต่อไปนี้:

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

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

// Commit the transaction
session.commitTransaction()

เมื่อฉันกด API นี้ในสภาพแวดล้อมท้องถิ่นของฉันฉันได้รับข้อผิดพลาดดังต่อไปนี้:

MongoError: การปรับใช้ MongoDB นี้ไม่รองรับการเขียนซ้ำได้ โปรดเพิ่ม retryWrites = false ในสตริงการเชื่อมต่อของคุณ

เมื่อฉันกด API นี้ในสภาพแวดล้อมระยะไกลจากนั้นก็ทำงานได้ดี ฉันใช้https://www.clever-cloud.comเป็นคลาวด์ฐานข้อมูลและ AWS เป็น api cloud

ดังที่เขียนไว้ในข้อความแสดงข้อผิดพลาดฉันพยายามใส่ retryWrites=false

  • ในตอนท้ายของสตริงการเชื่อมต่อที่ฉันส่งไปยังพังพอนเป็น mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • ด้วยตัวเลือกที่retryWrites: falseส่งผ่านไปยังmongoose.connectวิธีการ
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

ไม่สามารถแก้ไขปัญหาข้างต้นได้

ด้านล่างเป็นผลลัพธ์ของmongo --versionคำสั่ง:

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

ฉันมีการแก้ปัญหาและพบข้อผิดพลาดจริงที่อยู่เบื้องหลังการโยนข้อผิดพลาดนี้คือ:

MongoError: อนุญาตให้ใช้หมายเลขธุรกรรมบนสมาชิกชุดแบบจำลองหรือ Mongo เท่านั้น

กรุณาแนะนำบางอย่าง


ฉันเริ่มเห็นข้อผิดพลาดเหล่านี้เช่นกัน ฉันใช้ Mlab กับ Heroku แต่การเพิ่มตัวเลือกในไคลเอนต์แก้ไขปัญหานี้ ฉันเพิ่งลองรุ่น URI และใช้งานได้ดี แปลก.
Mig

ฉันใช้เซิร์ฟเวอร์แบบสแตนด์อโลนและเป็นสาเหตุของข้อผิดพลาดนี้ ข้อผิดพลาดเริ่มต้นไม่ใช่ของจริงและสามารถแก้ไขได้ในภายหลังด้วยชุดแบบจำลองหรือคลัสเตอร์ที่แชร์ ดูnpmjs.com/package/run-rs
Andro Developer

คำตอบ:


2

ธุรกรรมเป็นฟีเจอร์ใหม่ที่น่าตื่นเต้นที่สุดอย่างไม่ต้องสงสัยใน MongoDB 4.0 แต่น่าเสียดายที่เครื่องมือส่วนใหญ่สำหรับการติดตั้งและใช้งาน MongoDB เริ่มต้นเซิร์ฟเวอร์แบบสแตนด์อโลนซึ่งต่างจากชุดแบบจำลอง หากคุณพยายามเริ่มเซสชันบนเซิร์ฟเวอร์แบบสแตนด์อโลนคุณจะได้รับข้อผิดพลาดนี้

ปัญหานี้สามารถแก้ไขได้โดยใช้ชุดแบบจำลองบนสภาพแวดล้อมท้องถิ่นของคุณ

ฉันใช้run-rsเพื่อจุดประสงค์นี้


2

ตามที่แนะนำในคำตอบที่ยอมรับคุณต้องให้เซิร์ฟเวอร์ภายในเครื่องของคุณทำงานเป็นชุดแบบจำลองเพื่อให้สามารถทำธุรกรรมได้ซึ่งต่างจากเซิร์ฟเวอร์แบบสแตนด์อโลน

อย่างไรก็ตามนอกเหนือจากโซลูชันที่เสนอคุณสามารถแปลงฐานข้อมูลแบบสแตนด์อโลนในระบบของคุณเป็นชุดจำลองโดยไม่ต้องใช้เครื่องมือของบุคคลที่สามใด ๆโดยทำตามคำแนะนำในเอกสารประกอบ MongoDBโดยสรุปดังนี้:

  1. หยุดอินสแตนซ์ Mongoong แบบสแตนด์อโลนของคุณและรีสตาร์ทด้วยreplSetอาร์กิวเมนต์
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. เชื่อมต่อกับอินสแตนซ์ของคุณด้วยmongoเชลล์และเริ่มชุดชุดแบบจำลองใหม่
rs.initiate()

ตอนนี้คุณควรมีชุดการจำลองแทนเซิร์ฟเวอร์ mongodb แบบสแตนด์อโลนซึ่งคุณสามารถทำธุรกรรมบนสภาพแวดล้อมท้องถิ่นของคุณเพื่ออัปเดตเอกสารหลายรายการพร้อมกัน!

อย่าลืมที่จะรวมการreplSetโต้แย้งทุกครั้งที่คุณต้องการเริ่มต้นเซิร์ฟเวอร์มิฉะนั้นจะเริ่มเป็น Standalone ฉันใช้คำสั่งเดียวกับในขั้นตอนที่ 1 เพื่อเรียกใช้อีกครั้ง


หรือคุณสามารถปรับใช้ชุดจำลองใหม่ตั้งแต่ต้นเพื่อทดสอบสภาพแวดล้อมโดยทำตามคำแนะนำอื่น ๆ เหล่านี้ในเอกสารประกอบ MongoDB


0

โปรดแก้ไขApp/Config/databaseไฟล์เพิ่ม'retryWrites'=>falseในสตริงการเชื่อมต่อ Mongodb

เขียนการเชื่อมต่อ Mongo db

'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
            ]
        ],

บันทึกและเรียกใช้


0

โปรดลองเพิ่ม&retryWrites=falseลงในสตริงการเชื่อมต่อของคุณ

-

ฉันได้รับข้อผิดพลาดจริง ๆ ใน OP เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ db ระยะไกลของเราในขณะที่มันทำงานในพื้นที่ ฉันติดต่อฝ่ายสนับสนุนโฮสติ้ง mongo ของเราก่อนลองข้อเสนอแนะที่ผิดพลาด

-

นี่คือสิ่งที่เว็บไซต์ mongo ของเรา (mLab) กล่าวไว้:

อาจเป็นไปได้ว่าไดรเวอร์ของแอปของคุณได้รับการอัปเดตเป็นเวอร์ชันที่ใหม่กว่าซึ่งกำลังพยายามใช้คุณสมบัติ WiredTiger เท่านั้น ตามข้อผิดพลาดที่กล่าวถึงคุณจะต้องเพิ่ม & retryWrites = false ในสตริงการเชื่อมต่อของคุณ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.