slick事务查询没有回滚

4bbkushb  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(355)

根据文档在slick中发出事务查询的方法是调用 transactionallyDBIOAction 示例。但是,在我的例子中,只有产生错误的操作没有被执行。由序列中的其他操作引入的更改(发生在失败的操作之前而不是之后)将写入数据库而不是回滚。

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和MySQL5.7.22。
我能做些什么来保证事务性和回滚序列中的所有查询以防其中一个失败?

ha5z0ras

ha5z0ras1#

事务不工作的原因是数据库引擎。这与斯里克无关。我使用的表使用的是myisam引擎,它不支持事务。
将引擎切换到innodb后,事务按预期工作。
其他人早在我之前就发现了这一点:
https://stackoverflow.com/a/32913817/216021
https://stackoverflow.com/a/8036049/216021

相关问题