1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zane_young-mongo-tx

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Mongo-tx

Гибкая и расширяемая библиотека транзакций MongoDB.

Описание

A flexible & extensible MongoDB transaction library.

  • Установка:

    • npm i --save mongo-tx
    • yarn add mongo-tx
  • Использование:

    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:
  • Введение:

Когда вы создаёте транзакцию и запускаете её, вам нужно использовать оболочки модели для изменения данных во время транзакций. Каждая оболочка модели создаст блокировку и снимок перед поиском/поиском одного/созданием/модификацией/удалением документов. После того как все операции с этими документами в этой транзакции завершатся успешно, менеджер транзакций удалит все снимки и снимет все блокировки (зафиксирует). Если в этой транзакции произошла ошибка, все изменённые документы будут заменены снимками, а блокировки также будут сняты (откат).

  • Блокировка: Встроенная блокировка реализуется с помощью уникального ключа mongo, и с использованием jdarling/MongoMQ для создания ожидающей блокировки. Вы можете создать свою собственную блокировку с помощью redis, ssdb или другой библиотеки.
  1. Этот тип блокировки не будет работать так же, как любая реляционная база данных, вам необходимо вручную получить блокировку, чтобы убедиться, что это синхронизированная операция. Если вам нужно убедиться, что «заблокированный документ» в транзакции также заблокирован в любом другом месте, лучше всего создать транзакцию для него или получить блокировку документа:
  2. Ожидающая блокировка не так безопасна, как вы ожидали, она может потерпеть неудачу во многих случаях, например, слишком много транзакций используют одну и ту же блокировку, вызывая тайм-аут, циклические блокировки вызывают взаимоблокировку и тайм-аут (tx1 нужна блокировка acc1 & acc2, у неё заблокирована acc1; tx2 нужна блокировка acc2 & acc1, и у неё заблокирована acc2, тогда они обе потерпят неудачу с ошибкой тайм-аута), например. Просто убедитесь, что вы знаете, что ожидающая блокировка потерпит неудачу.
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) {
    // ...
  }
}

Tips

Для более подробного рассмотрения вариантов использования обратитесь к папке test.

Дополнительные параметры можно найти в каждом методе реализации.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Гибкий расширяемый пакет обработки транзакций для nodejs и mongodb с поддержкой отката при ошибке, транзакционных блокировок, блокировок на уровне одного документа и независимостью от ODM. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zane_young-mongo-tx.git
git@api.gitlife.ru:oschina-mirror/zane_young-mongo-tx.git
oschina-mirror
zane_young-mongo-tx
zane_young-mongo-tx
master