Mongo-tx
Гибкая и расширяемая библиотека транзакций MongoDB.
Описание
A flexible & extensible MongoDB transaction library.
Установка:
Использование:
import mongoTx from 'mongo-tx'
import createMongoModel from 'mongo-tx/lib/implements/create-mongo-model'
import createMongoLock from 'mongo-tx/lib/implements/create-mongo-lock'
const runTx = mongoTx({ // mongoTx options
createModel: createMongoModel({ db: nativeDb }),
createLock: createMongoLock({ db: nativeDb, wait: true }), // wait is true: wait until current release is release instead of throw an error
txColName: 'tx_manager', // collection name of transactions, default `tx_manager`
commitRetry: 3, // commit retry times, default is 3
commitInterval: 300, // commit retry interval, default is 300ms
rollbackRetry: 3, // rollback retry times, default is 3
rollbackInterval: 300, // rollback retry interval, default is 300ms
lockTxName: false, // whether create a lock for the transaction name, this would cause transactions with the same name runs serially, default is false
})
/**
* @param {string|array} txName can be an array to create multi locks for txName
* @param {object} options optional, would override mongoTx options
* @param {function} fn async function to run your transtaion
* @type {[type]}
*/
await runTx('some_transfer', async tx => {
const TxAccounts = tx.wrap('accounts')
let acc1 = await TxAccounts.findOne({name: 'u1'}, {_id: 1})
let acc2 = await TxAccounts.findOne({name: 'u2'}, {_id: 1})
await TxAccounts.findOneAndUpdate({
name: 'u1',
}, {
$set: {
money: acc1.money - 100,
},
})
throw new Error('Some error cause auto rollback!')
await TxAccounts.findOneAndUpdate({
name: 'u2',
}, {
$set:
Введение:
Когда вы создаёте транзакцию и запускаете её, вам нужно использовать оболочки модели для изменения данных во время транзакций. Каждая оболочка модели создаст блокировку и снимок перед поиском/поиском одного/созданием/модификацией/удалением документов. После того как все операции с этими документами в этой транзакции завершатся успешно, менеджер транзакций удалит все снимки и снимет все блокировки (зафиксирует). Если в этой транзакции произошла ошибка, все изменённые документы будут заменены снимками, а блокировки также будут сняты (откат).
const lock = runTx.createDocLock(colName: string, docId: ObjectId|string)
await lock.lock()
// do something
await lock.release()
Исправление сбоя процесса: Если весь ваш процесс аварийно завершился во время транзакции, вызовите runTx.fixCrash() после перезапуска вашего процесса (и убедитесь, что mongodb подключён), эта функция попытается откатить выполняющиеся/откатные транзакции и зафиксировать выполняющиеся транзакции.
WriteConcern: Все коллекции в этой библиотеке используют {w: 1, j: 1}, чтобы обеспечить запись в журнал, и вы можете изменить его при необходимости. ## TxModel
class TxModel {
/**
* insert document
* @param {object} doc
* @return {} document with _id
*/
create(doc: object) {
// ...
},
/**
* find documents
* @param {object} match query expression
* @return {Array<object>} documents
*/
find(match) {
// ...
},
/**
* find one document
* @param {object} match query expression
* @return {object} document
*/
findOne(match) {
// ...
},
/**
* findOneAndUpdate
* @param {object} match query expression
* @param {object} update update expression
* @param {object} options see native-mongo-driver
* @return {object} original doc or new doc
*/
findOneAndUpdate(match, update, options) {
// ...
},
/**
* findOneAndRemove
* @param {object} match query expression
* @param {object} options see native-mongo-driver
* @return {object} original doc
*/
findOneAndRemove(match, options) {
// ...
}
}
Для более подробного рассмотрения вариантов использования обратитесь к папке test.
Дополнительные параметры можно найти в каждом методе реализации.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )