Есть ли возможность создавать транзакции с атомной базой данных с книжной полкой? У меня проблема с дубликатами в базе данных. Проблематично код, как показано ниже:bookshelf.js операции блокировки
bookshelf.transaction(function (t) {
var modelLocation = new Models.Location({'name':event.venue});
modelLocation.fetch({transacting:t})
.then(function (fetchedLocation) {
if (!fetchedLocation) {
modelLocation.save(null,{transacting:t}).then(function (savedModel) {
t.commit(savedModel)
}).catch(function (err) {
t.rollback(err)
});
}
else{
t.commit(fetchedLocation)
}
})
})
я вызвать метод, содержащий этот код почти Simultaniously и асинхронно в 20 раз. Из этих 20 имеется 5 дублирующих наборов данных. В результате получается около 2-3 дубликатов в базе данных. Текущее обходное решение состоит в том, чтобы обернуть все это в setTimeout со случайным интервалом между 0 и 10 секундами, который почти никогда не дает мне дубликатов. Но это, очевидно, не готовое к производству решение.
Не удалось ли решить вашу проблему с помощью ключа UNIQUE? То, что вы пытаетесь достичь, это своего рода «транзакционное отсутствие», эта концепция для меня совершенно новая. AFAIK no DB реализует такой механизм. Можете ли вы работать с другими технологиями? – flaviodesousa
Я изначально хотел решить его с помощью уникальных ключей, но потом он просто бросает ошибки, и вам придется их поймать. Поэтому я предпочитаю ручное планирование запросов. Мне нужно это https://en.wikipedia.org/wiki/Two-phase_locking. Это базовая функциональность db. – user1862511
Да, knex поддерживает блокировку по тофу, хотя forUpdate() и forShare(). Но по вашему сценарию нет объекта блокировки или, как я уже сказал, «транзакционного отсутствия», я думаю, что двухфазная блокировка не покрывает это. – flaviodesousa