【问题标题】:Slick transactional queries are not being rolled back光滑的事务查询没有被回滚
【发布时间】:2018-11-08 01:07:38
【问题描述】:

在光滑的according to docs 中发出事务查询的方法是在DBIOAction 实例上调用transactionally。但是,在我的情况下,只有产生错误的操作没有被执行。序列中其他操作引入的更改(发生在失败操作之前但不在失败之后)将写入数据库而不是回滚。

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)
}

我想关联存储在多个表中但必须完全存储或根本不存储的传入数据。

DBActions 是插入,使用 sql 插值器创建。

我已确认尽管单元测试和外部工具的个别操作失败,但数据仍在写入和保留。

slick 3.2.3 与 mysql 5.7.22。

如果其中一个查询失败,我可以做些什么来保证事务性并回滚序列的所有查询?

【问题讨论】:

    标签: mysql scala transactions slick


    【解决方案1】:

    事务不工作的原因是数据库引擎。它与 Slick 无关。我一直在使用的表使用了 MyISAM 引擎,does not support transactions

    将引擎切换到 InnoDB 后,事务按预期工作。

    其他人早在我之前就发现了这一点:
    https://stackoverflow.com/a/32913817/216021

    https://stackoverflow.com/a/8036049/216021

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2015-06-25
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多