新聞中心
NEWS
當前位置: 首頁(yè) > 口碑營(yíng)銷(xiāo)
mongodb中事務(wù)處理方法有哪些
時(shí)間:2026-05-05 03:10:49MongoDB中事務(wù)處理方法有哪些?處理
MongoDB是一個(gè)基于文檔的NoSQL數據庫,它支持ACID(原子性、事務(wù)一致性、處理隔(′▽?zhuān)?)離性和持久性)事務(wù),事務(wù)在MongoD(′ω`*)B中,處理事務(wù)處理主要用于確保一組操作要么全部成(′ω`*)功,事務(wù)要么全部失敗,處理這對于??需要保證數據完整性的事務(wù)場(chǎng)景非常有用,例如銀行轉賬、處理訂單處理等,事務(wù)本文將介紹MongoDB中的處理事務(wù)處理方法??,包括使用startSess??ion()??、事務(wù)commitTran(′?ω?`)saction()和abortTransaction()等方法。
1、使用star(′?_?`)tSession()開(kāi)始一個(gè)會(huì )話(huà)
在MongoDB中,事務(wù)處理始于一個(gè)會(huì )話(huà),要開(kāi)始一個(gè)會(huì )話(huà),可以使用startSe??ssi??on()方法,這個(gè)方法(/ω\)返回一個(gè)ClientSession對象,該對象包含了??事務(wù)的所有信息,以下是一個(gè)示例:
const session = db.startSession();
2、使用withTransaction()執行事務(wù)操作
在MongoDB中,可以使用withTransaction()方法來(lái)執行一系(xi)列事務(wù)操作,這個(gè)方法接受一個(gè)回調函數作為參數,回調函數中的每個(gè)操作都會(huì )在一個(gè)事務(wù)中執行,如果回調函數中的任何操作失敗,整個(gè)事務(wù)都會(huì )回滾,以下是一個(gè)示例:
async function performOpe???rations() { try { await withTransaction(session, asynヾ(^-^)ノc () => { const resヽ(′▽?zhuān)?ノult1 = await collection.insertOne({ a: 1 }); con(′-ι_-`)st result2 = awaiヾ(′?`)?t?? collection.updateOne({ b: 2 }, { $set: { c: 3 } }); con(′?`)st result3 = await collection.deleteOne({ d: 4 }); return [resu??lt1, result2, result3]; })(◎_◎;); } catch (erヽ(′ー`)ノror) { console??.error('Trans(′?`*)action failed:', error); } finally { session.endSession(); }}3、使用commitTransaction()提交事務(wù)
當所有事務(wù)操作都成功完成時(shí),需要使用commitTransaction()方法來(lái)提交事務(wù),這個(gè)方法會(huì )將所有在會(huì )話(huà)中修改的數據寫(xiě)回到數據庫,以下是一個(gè)示(O_O)例:
async function com(?????)mitTransaction(results) { try { const writeResult = await session.client.database.command({ commitTransaction: session.transactio??nId }); if (writeRe(╬?益?)sult.ok === 1) { const successResults = result(′;д;`)s.filter((result) => result.ok > 0); const failureResults = results.filte(′?_?`)r((result(′?`*)) =>(′?ω?`); result.ok === 0); const errors = failureResu( ?ω?)lts.map((result) => resul??t.errmsg || 'Unknown error'); const errorMessage = Transaction committed with ${ successResults.length} success and ${ failureResults.length} failure result(′?`)s: + errors.join(''); } else if (writeResult.errmsg) { const err??orMessage = Failed to commit transaction: ${ writeResult.errms(′▽?zhuān)?g}; } else { const errorMessa??ge = 'Failed to commit transaction'; } } catch (e(′▽?zhuān)?rror) { Object.assign(error, writeResult); Object.assign(error, results[0]); // Assuming the firs(???)t result is the first operation in the tra(′_ゝ`)nsaction Object.assign(error, results[1]); // Assuming the second result is the se??cond operation in the transaction Objeヽ(′▽?zhuān)?ノct.assign((′?`)e??rror, results[2(//ω//)]); // Assuming the third result is( ???) the third operation in the transaction Object.assign(error, seヽ(′ー`)ノssion); // Add session info to?? error object if needed Object.assign(error, session.client); // Add client info to error object if(′?`*) needed Object.assign(error, session.client.topology); // Add top(′ω`)ology?? info to error object if needed Ob┐(′?`)┌jec??t.assign(error, session.client.d?atabase); // Add database info to error object if needed Object.assign(erro(???)r, session.client.database.collections??); // Add collection(╯°□°)╯︵ ┻━┻s info to error object if needed Object.assi(O_O)gn(error, session.client.databaseCヽ(′ー`)ノommands); // Add commands info to error object if needed Object.assign??(error, session.client.cursor); //(′?`) Add cursor info to error object if needed Obj??ect.assign(error, session.client.readPreference); // Add read preference info to(′?`) error object if needed Object.a??ssign(error, sesヽ(′ー`)ノsion.clientOptions); // Add client options info to error object if needed Object.assign(error, session.clientTopology); // Add client topology info to error?? object if needed Object.??assign(error, session.clientヽ(′?`)ノTopologyDescription); // Add client topology desc??ription info to error objec??t if needed Object.assign(error, session.clientTopologyOptions); // Add cli??ent topology option┐(′?`)┌s info to error obje??ct if nee??ded Object.assign(error, session.clientUser); // Add client user info to error object if needed Object.assign(error, session.clientWriteConcern); //ヽ(′ー`)ノ Add client write concern info to error object if needed Object.assign(error, session.logicalSess(/ω\)ionTimeoutMinutes); // Ad??d logical session timeout minutes info to error object if needed Object.ass(′_`)ign(error, session.logic┐(′?`)┌alSessionTimeo??u??tSeconds)(′ω`*); // Add logical session timeout seconds inf??o to error object if needed Object.assign(error, session(°ロ°) !.(′▽?zhuān)?)maxTimeMS); // Add max time?? ms info to error object if nee??ded Obje(′▽?zhuān)?ct.assign(error, session.__txnCommitted); // Add __txnCo(╯°□°)╯mmitted flag info to error object if needed Object.assign(error┐(′д`)┌, session.__txnStarte??d??OnPrimary); // Add __txnStartedOnPrimary flag info to error object if(′?`) needed┐(′ー`)┌ Object.assi??gn(error, session.__txnNumber); // Add __txnNumヾ(?■_■)ノber info to error object if needed Object.assign(e(′▽?zhuān)?r( ???)ror, session.__uncommittedChanges); // Add?? __uncommittedChanges info to error object if needed Object.assign(error, session.__autocomm??itRequested); // Add __autocommitRequested info to error object if needed Object.assign(erro??r, session.__supportsMasterDowngrade); // Add __suppoヽ(′?`)ノrtsMasterDowngrade info to error object if needed Object.assign(error??, session.__inMultiDocumentTransaction); //?? Add __inMultiDocumentTransaction info to error object if needed Object.assign(error, session.__hasUncommittedWritesErrorMsg); // Add __hasUnco??mmittedWritesEr(°o°)rorMsg info to error object if needed Object.assign(error, session.__hasInvalidatedSnapshotErrorMsg); // Add __hasInvalidatedSnaps??hotErrorMsg info to error object if needed Object.as??sign(error, session.__hasReadConflictErrorMsg); // Add __hasReadConflictErrorMsg info to error object if needed Object
客服電話(huà)13323327978
Copyright ? 2012-2018 天津九安特機電工程有限公司 版權所有 備案號:
客服電話(huà)18181754170