2017-02-21 46 views
1

я хочу использовать transactions в PlaySlickScalaИграть Scala Slick сделок

у меня есть три различных метода, который возвращает логическое значение

def updateFirst() 
def updateSecond() 
def updateThird() 

Я пытаюсь запустить следующую команду, но это, кажется, transactionally команда не найдено

val operations = 
    for { 
    _ <- updateFirst() 
    _ <- updateSecond() 
    _ <- updateThird() 
    } yield() 

sync(db.run(operations).transactionally)) 

Моя кодовая версия sbt версия, связанная с slick выглядит следующим образом:

"com.typesafe.play" %% "play-slick" % "2.0.0", 
"com.typesafe.play" %% "play-slick-evolutions" % "2.0.0", 
"com.typesafe.slick" %% "slick" % "3.0.1", 

Даже DBIO ничего не показывает.

Любая помощь или руководство оценены.

ответ

4

Взгляните на этот ответ: https://stackoverflow.com/a/41624229/2239369

Это было покрыто несколько раз уже - вы можете только создавать операции в транзакции, пока они возвращаются DBIO[T] (где T ваш полученный тип). В вашем случае ваши методы должны возвращать:

def updateFirst(): DBIO[Boolean] 
def updateSecond(): DBIO[Boolean] 
def updateThird(): DBIO[Boolean] 

Кроме того, ваша последняя строка должна быть:

sync(db.run(operations.transactionally)) 

(transactionally вызывается DBIO, а не на Future)

Также обратите внимание на следующее slide: http://slides.com/pdolega/slick-101#/85

+0

Как преобразовать мой метод в DBIO [Boolean]? Это примерная синхронизация (db.run (query.update (status))) == 1 .. Я также попытался удалить синхронизацию и другие вещи –

+0

Просто конвертируйте 'sync (db.run (query.update (status))) == 1' этому: 'query.update (status) .map (_ == 1)' –

+0

Спасибо, тонна Pawal. –