Scala 如何在slick中使用事务
我有这样的插入方法(权重是索引) 并返回异常(唯一索引) 如何解决这个问题,我不使用理解或插入第一个onComplete。就说两遍吧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
谢谢。这是一个常见的错误-转换到
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))