在光滑according to docs中发布事务性查询的方法是在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
插值器创建。
我已经确认正在编写和保留的数据,尽管单元测试和外部工具的个别操作失败。
使用mysql 5.7.22进行光滑的3.2.3。
如果其中一个查询失败,我该怎么做才能保证事务性和回滚序列的所有查询?
答案 0 :(得分:0)
交易无效的原因是数据库引擎。它与Slick无关。我一直在使用的表使用了MyISAM引擎does not support transactions。
将引擎切换到InnoDB后,事务按预期工作。
其他人在我做之前很久就发现了这一点: