mysql - 灵活的事务查询不会被回滚

标签 mysql scala transactions slick

在 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

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

关于mysql - 灵活的事务查询不会被回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583304/

相关文章:

php - 如何在以下场景中使用 PHP、jQuery 和 AJAX 实现自动完成功能?

Scala将递归有界类型参数(F-bounded)转换为类型成员

c# - sitecore 插入项目数据完整性

database - 如何修复无法在分布式事务中启用 Sybase 数据库的错误?

mysql - Laravel 4.2 Eloquent 关系 leftjoin ON 复杂

javascript - NodeJS + MySql 请求

MySQL 子查询中的错误 1349 SELECT 问题

scala - 如何在sbt中编译单个文件

scala - Lift (Scala) 嵌套片段(每天多个项目)

java - ApplicationContext 的子方法中事务未激活