Гладкие транзакционные запросы не откатываются

0

Способ выдачи транзакционных запросов в 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.

Что я могу сделать, чтобы гарантировать транзакцию и откат всех запросов последовательности, если один из них не работает?

Теги:
transactions
slick

1 ответ

0
Лучший ответ

Причиной неработающих транзакций был механизм БД. Это не имело никакого отношения к Слику. В таблицах, в которых я работал, использовался движок MyISAM, который не поддерживает транзакции.

После переключения двигателя на транзакции InnoDB работали, как ожидалось.

другие это выяснили задолго до того, как я это сделал:
qaru.site/questions/103779/...

qaru.site/questions/271576/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню