Возможна ли СДЕЛКА с помощью секвелиза? - PullRequest
2 голосов
/ 27 января 2012

Я использую скрипт, который сначала устанавливает статус всех моих строк на 0, а затем индивидуально устанавливает статус некоторых строк на разные значения.Это делается раз в минуту.Я уже неоднократно замечал, что могу выполнить SELECT для своей базы данных и получить совершенно неверные результаты, поскольку многие или все мои строки имеют статус 0.Кажется, что это разрыв в одну секунду в минуту, когда SELECTs получит неверные данные.

Я думал об использовании sequelize QueryChainer, но этого по-прежнему недостаточно, поскольку запрос на выборку можно легко получитьнекоторые некорректные данные, пока цепочник выполняет свои функции.

Так что мне было интересно, есть ли у sequelize метод, обеспечивающий, чтобы все мои запросы были задержаны и отправлены одновременно, так как я предполагаю, что это не такне имеет фактической поддержки СДЕЛКИ.

Ответы [ 2 ]

12 голосов
/ 17 декабря 2013

На момент фиксации cf8cd6eb769f2470b58c95e49114c05cdd1e3653 (конец ноября 2013 г.) транзакции теперь поддерживаются в Sequelize.Это недавно стало доступно в npm (ветки 1.7.0 и 2.0.0).API описан в запросе .

. Вам нужно что-то вроде:

sequelize.transaction(function(t) {
   Table.update({status: 0}, {}, { transaction: t });
   t.commit().success(function () { ... });
};
2 голосов
/ 27 января 2012

Вы правы, в настоящее время нет поддержки транзакций.Ваша проблема на самом деле звучит так, будто вы делаете что-то вроде:

sequelize.query('UPDATE mytable SET expired=0').success(function() {
  Mytable.findAll(/* conditions */ ).success(function(entries) {
    entries.forEach(function(entry){ entries.updateAttributes({expired:1}) })
    Mytable.findAll().success(function(entries){
      // check status of entries
    })
  })
})

Этот код обновляет некоторые записи, но не ждет, пока это будет сделано.Если у вас есть что-то вроде этого, вы должны использовать QueryChainer, например, так:

var chainer = new Sequelize.Utils.QueryChainer

entries.forEach(function(entry) {
  chainer.add(entry.updateAttributes({ expired: 1 }))
})

chainer.run().success(function() {
  // now go on here
})

Если у вас нет вышеуказанной ошибки и вы хотите сначала собрать все операции и выполнить их массово впоследствии (и последовательно), сделайте это:

var chainer = new Sequelize.Utils.QueryChainer

entries.forEach(function(entry) {
  chainer.add(entry, 'updateAttributes', [{ expired: 1 }])
})

chainer.runSerially().success(function() {
  // now go on here
})

Надеюсь, что поможет

...