Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在slick中使用事务_Scala_Slick 3.0 - Fatal编程技术网

Scala 如何在slick中使用事务

Scala 如何在slick中使用事务,scala,slick-3.0,Scala,Slick 3.0,我有这样的插入方法(权重是索引) 并返回异常(唯一索引) 如何解决这个问题,我不使用理解或插入第一个onComplete。就说两遍吧 谢谢。这是一个常见的错误-转换到Future到early(换句话说,调用db.run(…)到early) 您需要做的是删除此方法,因为它(可能有点不直观)弊大于利: implicit def run[A](action: DBIOAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = { d

我有这样的插入方法(权重是索引)

并返回异常(唯一索引)

如何解决这个问题,我不使用理解或插入第一个onComplete。就说两遍吧


谢谢。

这是一个常见的错误-转换到
Future
到early(换句话说,调用
db.run(…)
到early)

您需要做的是删除此方法,因为它(可能有点不直观)弊大于利:

implicit def run[A](action: DBIOAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
    db.run(action)
  }
然后你会这样做:

val firstInsert = insert(CategoryExtractor("1", "name", "scala every where", 0, 0, 0, None)) map {
    data => println(data)
}

val secondInsert = insert(CategoryExtractor("2", "name", "haskell every where", 0, 0, 0, None)) map {
    data => println(data)
}

db.run(DBIO.seq(firstInsert, secondInsert).transactionally))
基本上,问题是:一旦您将
DBIO
转换为
Future
,您就失去了将操作捆绑到单个事务中的能力。
因此您基本上可以使用不同的DBIO转换来做所有事情(通常的东西是:
map
flatMap
seq
等)只有在最后一步启动
db.run(yourcomposedbio.transactional)

编辑: 下面是我几周前做的演示中关于处理事务和
DBIO
组合的更多信息。相关幻灯片:(并进一步)


还有一个由Dave Gurnell主持的很棒的研讨会,他在01:05:00左右讨论了这个问题(链接:)

这是一个常见的错误-将
Future
转换为early(换句话说,调用
db.run(…)
转换为early)

您需要做的是删除此方法,因为它(可能有点不直观)弊大于利:

implicit def run[A](action: DBIOAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
    db.run(action)
  }
然后你会这样做:

val firstInsert = insert(CategoryExtractor("1", "name", "scala every where", 0, 0, 0, None)) map {
    data => println(data)
}

val secondInsert = insert(CategoryExtractor("2", "name", "haskell every where", 0, 0, 0, None)) map {
    data => println(data)
}

db.run(DBIO.seq(firstInsert, secondInsert).transactionally))
基本上,问题是:一旦您将
DBIO
转换为
Future
,您就失去了将操作捆绑到单个事务中的能力。
因此您基本上可以使用不同的DBIO转换来做所有事情(通常的东西是:
map
flatMap
seq
等)只有在最后一步启动
db.run(yourcomposedbio.transactional)

编辑: 下面是我几周前做的演示中关于处理事务和
DBIO
组合的更多信息。相关幻灯片:(并进一步)


还有一个由Dave Gurnell主持的很棒的研讨会,他在大约:01:05:00(此处链接:)

讨论了这个问题,我遇到了一个新问题。我有一个列表(dataToUpdate),我想把它们更新到数据库中。我的代码=>
db.run({ns category.filter({ns.id==x.uuid).update(x))}生成ns.transactional)
如果列表中的uuid在数据库中没有,则回滚它。我尝试以事务性的方式使用,但对我来说,使用println(数据)作为未来的处理并不是一个好的执行实际操作的例子。你应该演示一些不返回UnitHey@AndrewNorman的东西,大体上我同意。在这个特殊的例子中,我不确定——答案尽可能地模仿问题的上下文(println来自于问题)。这很有效,我有了一个新问题。我有一个列表(dataToUpdate),我想把它们更新到数据库中。我的代码=>
db.run({ns category.filter({ns.id==x.uuid).update(x))}生成ns.transactional)
如果列表中的uuid在数据库中没有,则回滚它。我尝试以事务性的方式使用,但对我来说,使用println(数据)作为未来的处理并不是一个好的执行实际操作的例子。你应该演示一些不返回UnitHey@AndrewNorman的东西,大体上我同意。在这种特殊情况下,我不确定-答案尽量模仿问题的上下文(println来自问题)。
val firstInsert = insert(CategoryExtractor("1", "name", "scala every where", 0, 0, 0, None)) map {
    data => println(data)
}

val secondInsert = insert(CategoryExtractor("2", "name", "haskell every where", 0, 0, 0, None)) map {
    data => println(data)
}

db.run(DBIO.seq(firstInsert, secondInsert).transactionally))