2015-10-26 11 views
5

Mam pytanie o Slick 3 i TransakcjeSlick 3 Transakcje z logiką w Scala

Przeczytałem dokumentację

http://slick.typesafe.com/doc/3.1.0/dbio.html

a drugi Slick 3 transakcja podważenie

Slick 3 Transactions

Executing non-database actions in a transaction in Slick 3

Ale one mi nie pomogły

Potrzebuję odczytać niektóre wartości z bazy danych, uruchomić trochę logiki w Scali, a następnie, w zależności od wyniku, zmodyfikować bazę danych. Chcę, żeby cała operacja była atomowa.

Mój kod wygląda mniej więcej tak:

database.run(TableQuery[X].filter(blah).result).map { x => 
    database.run { 
    if(someLogicNotInSQL(x)) 
     TableQuery[Y].insert(someFoo) 
    else 
     TableQuery[Y].insert(someBah) 
    } 
} 

Jak uzyskać wartość zapytania uruchomić jakąś logikę w Scala, a następnie uruchomić kolejną akcję (np insert) wszystko jako jedną transakcję atomowej.

Dzięki Peter

Odpowiedz

4

Aby uruchomić ten w transakcji będzie chciał skonstruować jednego działania, który zawiera pytania i logiki. Następnie uruchom tę akcję za pomocą transakcji.

Modyfikacja przykład:

import scala.concurrent.ExecutionContext.Implicits.global 

val action = 
    tableQuery.filter(blah).result.flatMap { x => 
    if (someLogicNotInSql(x)) 
     tableQuery.insert(someFoo) 
    else 
     tableQuery.insert(someBah) 
    } 

flatMap wymaga jako argument funkcję z x do DBIO[T]. Będzie sekwencjonować dwie akcje razem, umożliwiając drugiemu użycie wyniku pierwszego.

Aby uruchomić tę połączoną akcję, potrzebny jest kontekst wykonania. (Ponieważ twoje obliczenia, if (someLogicNotInSql ..., będą musiały działać gdzieś w jakimś wątku, a nie w wewnętrznym kontekście wykonania Slicka).

Można owinąć to połączone działanie w transakcji i po prostu zadzwonić run raz:

val future = database.run(action.transactionally)