2015-07-07 5 views
1

Я занимаюсь обновлением приложения Play Framework с помощью slick 2.1.0 для play-slick 1.0.0 (включая slick 3.0.0).Множественные вставки в одной транзакции с Slick 3.0

У меня возникли проблемы с пониманием того, как обрабатываются транзакции.

Допустим, у меня есть следующий фрагмент кода:

db.withTransaction { implicit session => 
    for (id <- ids) yield someTable.insert(SomeObject(id)) 
} 

Как сделать это в пятно 3? Я хочу, чтобы все объекты были вставлены в одну транзакцию. Если один объект не вставлен, ни один из них не должен быть вставлен.

ответ

1

Согласно documentation, вы можете использовать .transactionally на DB-акции:

val a = (for { 
    ns <- coffees.filter(_.name.startsWith("ESPRESSO")).map(_.name).result 
    _ <- DBIO.seq(ns.map(n => coffees.filter(_.name === n).delete): _*) 
} yield()).transactionally 

val f: Future[Unit] = db.run(a) 

Что дает в следующем примере для предусмотренного кода:

val a = (for (id <- ids){ 
    someTable.insert(SomeObject(id)) 
} yield()).transactionally 

val f: Future[Unit] = db.run(a) 
+0

Это не работает. Не похоже, что функция 'insert' существует уже. Я попытался заменить его на '+ =', но это тоже не сработает. – ulejon

+0

После некоторого разговора я придумал следующее: 'val toInsert = for (id <- ids) yield SomeObject (id)' 'val insertActions = DBIO.seq (someTable ++ = toInsert.toSeq) .transactionly' 'val f: Future [Unit] = db.run (insertActions)' Не уверен, что это лучший способ сделать это? – ulejon

Смежные вопросы