MongoDB Academy · Lektion

Write concerns och bekräftad beständighet

Ni konfigurerar w:majority, w:1 och journalföringsalternativ för att finjustera beständighetsgarantin för skrivoperationer.

Lektion 3 av 413 steg

Write concerns och bekräftad beständighet är en gratis lektion i MongoDB Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för MongoDB Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i MongoDB Academy innehåller totalt 4 lektioner.

Vad är en write concern?

En write concern anger för MongoDB hur många medlemmar i replikuppsättningen som måste bekräfta en skrivning innan drivrutinen betraktar den som lyckad. Det är den viktigaste inställningen för avvägningen mellan hållbarhet (fler bekräftelser = säkrare) och latens (färre bekräftelser = snabbare). Varje skrivoperation — infogning, uppdatering, borttagning eller ersättning — kan ange sin egen write concern.

Alternativet w: räkna bekräftelser

Fältet w styr hur många medlemmar som måste bekräfta skrivningen. w: 0 betyder fire-and-forget (ingen bekräftelse alls). w: 1 (standard) betyder att endast primärmedlemmen måste bekräfta. w: 2 betyder primärmedlemmen plus en sekundärmedlem. w: 'majority' är den rekommenderade inställningen i produktion — den väntar på att en majoritet av de röstberättigade medlemmarna ska bekräfta.

// w:1 — only primary acknowledges (default)
db.orders.insertOne({ item: 'pen' }, { writeConcern: { w: 1 } })

// w:majority — safe for production
db.orders.insertOne({ item: 'pen' }, { writeConcern: { w: 'majority' } })

w: majority — den rekommenderade inställningen

w: 'majority' garanterar att skrivningen har replikerats till en majoritet av de röstberättigade medlemmarna innan drivrutinen tar emot ett lyckat svar. Det innebär att en nyvald primärmedlem alltid har sett skrivningen — även efter en failover. Det är den enda inställningen som förhindrar dataåterställning efter ett fel på primärmedlemmen.

// Set default write concern at the database level
db.runCommand({
  setDefaultRWConcern: 1,
  defaultWriteConcern: { w: 'majority', wtimeout: 5000 }
})

Alternativet j: journaling för hållbarhet

Alternativet j (journal) styr om MongoDB väntar på att skrivningen ska ha bekräftats i journalen på disk innan den skickar en bekräftelse. Med j: true kan inte ens en serverkrasch omedelbart efter bekräftelsen leda till att skrivningen går förlorad. Utan journaling (j: false) kan en krasch mellan skrivningen i minnet och nästa flush av journalen göra att operationen går förlorad.

// Fully durable write: majority replication + journaled
db.payments.insertOne(
  { amount: 499.99, currency: 'USD' },
  { writeConcern: { w: 'majority', j: true, wtimeout: 5000 } }
)

Alternativet wtimeout

wtimeout anger den maximala tiden (i millisekunder) som servern väntar på de nödvändiga w-bekräftelserna. Om tröskeln inte uppnås i tid returnerar MongoDB ett WriteConcernError — men skrivningen genomfördes fortfarande på primärmedlemmen. En timeout signalerar replikeringsfördröjning, inte ett skrivfel.

// Timeout after 3 seconds if secondaries are slow
db.logs.insertOne(
  { event: 'login', userId: 'u123' },
  { writeConcern: { w: 'majority', wtimeout: 3000 } }
)

w:0 Fire-and-Forget: när ska det användas?

w: 0 skickar skrivningen och returnerar omedelbart utan att vänta på någon bekräftelse. Detta maximerar genomströmningen för arbetsbelastningar med stora volymer där dataförlust kan tolereras, till exempel telemetri, analys händelser eller inläsning av loggar. Använd det aldrig för finansiella transaktioner, användargenererat innehåll eller data som ni inte har råd att förlora.

// High-throughput metrics logging — loss acceptable
await db.collection('metrics').insertMany(
  readings,
  { writeConcern: { w: 0 } }
)

Write concern och återställning

När en primärmedlem slutar fungera och en sekundärmedlem blir primärmedlem rullas alla skrivningar som den gamla primärmedlemmen ännu inte hade replikerat till en majoritet tillbaka. Dessa återställda skrivningar sparas i en återställningsmapp på disken för manuell återställning. Om ni använder w: 'majority' elimineras risken, eftersom skrivningen bara bekräftas efter att majoriteten har tagit emot den.

Kombinera write concern med transaktioner

I transaktioner med flera dokument gäller write concern vid steget commit, inte för enskilda operationer i transaktionen. Om ni genomför commit med w: 'majority' säkerställs att alla skrivningar i transaktionen är hållbara på en majoritet innan applikationen fortsätter. Write concerns på individuell operationsnivå i en transaktion ignoreras.

const session = client.startSession()
await session.withTransaction(async () => {
  await orders.insertOne({ item: 'book' }, { session })
  await inventory.updateOne({ _id: 1 }, { $inc: { qty: -1 } }, { session })
}, { writeConcern: { w: 'majority' } })

Standardinställning för write concern i MongoDB 5+

Sedan MongoDB 5.0 är den implicita standardinställningen för write concern w: 'majority' för replikuppsättningar och sharded-kluster. Före 5.0 var standardvärdet w: 1. Det innebär att moderna MongoDB-distributioner är säkra som standard, men ni bör ändå uttryckligen ange write concerns i kritisk applikationskod för tydlighet och portabilitet.

// Verify the current default write concern
db.adminCommand({ getDefaultRWConcern: 1 })
// { defaultWriteConcern: { w: 'majority' }, ... }

Write concern på klientnivå

Write concern kan anges på tre nivåer: operationsnivå (per infogning/uppdatering), samlingsnivå (när ni hämtar ett samlingshandtag) eller klient-/anslutningssträngsnivå. Mer specifika nivåer åsidosätter bredare nivåer. Om ni anger den på klientnivå gäller den som standard för alla operationer, medan inställningar på operationsnivå passar bäst för fall som kräver särskilda garantier för hållbarhet.

// Set write concern at MongoClient level
const client = new MongoClient(uri, {
  writeConcern: { w: 'majority', j: true, wtimeout: 5000 }
})

// Override per-operation when needed
await db.criticalData.insertOne(doc, { writeConcern: { w: 3 } })

Välj rätt write concern

Välj write concern utifrån hur kritiska data är. Finansiella/transaktionella data: w: 'majority', j: true. Användarinnehåll: w: 'majority'. Sessions-/cachedata: w: 1. Telemetri med stora volymer: w: 0. Rätt val balanserar kostnaden för att förlora data mot den latensförlust som uppstår när ni väntar på ytterligare bekräftelser.

Snabbtest

Testa era kunskaper om begreppen MongoDB & NoSQL Databases från den här lektionen.

Sammanfattning av lektionen

I den här lektionen har ni lärt er att: write concern w styr hur många medlemmar som måste bekräfta en skrivning, w: 'majority' är den rekommenderade produktionsinställningen och förhindrar återställning efter failover och j: true ger hållbarhet genom journalen på disk och skyddar vid krascher. Härnäst utforskar vi läspreferenser och hur ni fördelar läsbelastningen över replikuppsättningen.

Gratis att börja

Lär dig JavaScript med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Write concerns och bekräftad beständighet” gratis?

Ja – hela texten till ”Write concerns och bekräftad beständighet” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i MongoDB Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i MongoDB Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Write concerns och bekräftad beständighet”?

Ni konfigurerar w:majority, w:1 och journalföringsalternativ för att finjustera beständighetsgarantin för skrivoperationer. Ni övar på MongoDB Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig MongoDB Academy?

Du behöver inga förkunskaper. Utbildningen i MongoDB Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Write concerns och bekräftad beständighet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här MongoDB Academy-lektionen?

Ja. Varje MongoDB Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Replikuppsättningsmedlemmar: primär, sekundär och arbiter
  2. Val och automatisk failover
  3. Write concerns och bekräftad beständighet
  4. Läsinställningar: fördela läsbelastningen
← Tillbaka till MongoDB Academy