不会回滚灵活的事务查询
Slick transactional queries are not being rolled back
在 slick according to docs 中发出事务查询的方法是在 DBIOAction
实例上调用 transactionally
。但是,在我的例子中,只有产生错误的动作没有被执行。序列中其他操作引入的更改,发生在失败操作之前但不在失败操作之后,将写入 DB 而不会回滚。
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
s 是插入,使用 sql
插值器创建。
尽管单元测试和外部工具的个别操作失败,但我已确认正在写入和保留数据。
slick 3.2.3 与 mysql 5.7.22.
我能做些什么来保证事务性和回滚一个序列的所有查询以防其中一个查询失败?
事务不工作的原因是数据库引擎。这与 Slick 无关。我一直在使用的表使用了 MyISAM 引擎,does not support transactions。
将引擎切换到 InnoDB 后,事务按预期工作。
其他人比我早发现了这一点:
在 slick according to docs 中发出事务查询的方法是在 DBIOAction
实例上调用 transactionally
。但是,在我的例子中,只有产生错误的动作没有被执行。序列中其他操作引入的更改,发生在失败操作之前但不在失败操作之后,将写入 DB 而不会回滚。
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
s 是插入,使用 sql
插值器创建。
尽管单元测试和外部工具的个别操作失败,但我已确认正在写入和保留数据。
slick 3.2.3 与 mysql 5.7.22.
我能做些什么来保证事务性和回滚一个序列的所有查询以防其中一个查询失败?
事务不工作的原因是数据库引擎。这与 Slick 无关。我一直在使用的表使用了 MyISAM 引擎,does not support transactions。
将引擎切换到 InnoDB 后,事务按预期工作。
其他人比我早发现了这一点: