在 slick 中发出事务查询的方式 according to docs是在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 引擎,does not support transactions 。
将引擎切换到 InnoDB 后,事务按预期工作。
其他人早在我之前就发现了这一点:
https://stackoverflow.com/a/32913817/216021
关于mysql - 灵活的事务查询不会被回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583304/