Способ выдачи транзакционных запросов в slick в соответствии с документами заключается в вызове transactionally
на экземпляр DBIOAction
. Однако в моем случае только действие, вызывающее ошибку, не выполняется. Изменения, внесенные другими действиями в последовательности, предшествующие, но не после неудачной, записываются в БД и не откатываются назад.
def runTx(db: Database, queries: Iterable[DBIOAction[Int, NoStream, Effect]])(
implicit ec: ExecutionContext
): Future[Try[Iterable[Int]]] = {
val combined: DBIOAction[Iterable[Int], NoStream, Effect] = DBIO.sequence(queries)
val tx: DBIOAction[Try[Iterable[Int]], NoStream, Effect with Effect.Transactional] =
combined.transactionally.asTry
db.run(tx)
}
Я хочу сопоставить входящие данные, которые хранятся в нескольких таблицах, но должны быть полностью или полностью сохранены.
DBAction
- это вставки, созданные с использованием интерполятора sql
.
Я подтвердил, что данные записываются и сохраняются, несмотря на неудачи отдельных действий с помощью модульных тестов и внешних инструментов.
slick 3.2.3 с mysql 5.7.22.
Что я могу сделать, чтобы гарантировать транзакцию и откат всех запросов последовательности, если один из них не работает?
Причиной неработающих транзакций был механизм БД. Это не имело никакого отношения к Слику. В таблицах, в которых я работал, использовался движок MyISAM, который не поддерживает транзакции.
После переключения двигателя на транзакции InnoDB работали, как ожидалось.
другие это выяснили задолго до того, как я это сделал:
qaru.site/questions/103779/...