2016-05-19 6 views
1

通常、トランザクション内で複数のステートメントを実行します。しかし、私がSlick 3でtransactionallyを使用して見つけたすべての例では、ループ内で通常forを使用するときに、これらのステートメントをグループ化するための理解があります。Slick 3でトランザクションを使用する

これは(トランザクション内の2つのテーブルから削除)作品:

val action = db.run((for { 
     _ <- table1.filter(_.id1 === id).delete 
     _ <- table2.filter(_.id2=== id).delete 
    } yield()).transactionally) 
    val result = Await.result(action, Duration.Inf) 

しかし、必要なfor/yieldのですか?トランザクション内で2つ以上のステートメントを実行する代わりの方法がありますか?

答えて

4

DBIOActionにはtransactionallyを使用できますが、これは単なる理解の結果であるだけではありません。たとえば、あなたが一連のアクションを取り、順番に実行しますDBIO.seq方法と組み合わせてtransactionallyを使用することができます。

val firstAction = table1.filter(_.id === id1).delete 
val secondAction = table2.filter(_.id === id2).delete 

val combinedAction = DBIO.seq(
    firstAction, 
    secondAction 
).transactionally 
4

あなたの場合、for/yieldは必要なものを得るための唯一の方法ではありません。しかし、それを同等の表現に置き換える必要があります。 flatMapsとmapの組み合わせについては、理解度はsyntactic sugarです。 BDIOActionのすべてのアクションを集約するためにモナド構成を使用しているため、これらを使用する必要があります。 だから、あなたはまた、それを書くことができます:

val action = db.run(
    table1.filter(_.id1 === id).delete.map (_ => 
    table2.filter(_.id2=== id).delete 
).transactionally 
) 
val result = Await.result(action, Duration.Inf) 

ために通常使用されている理解のためのより多くの、きれいに簡単に理解するために、縮尺が非常に簡単です。

val action = db.run((for { 
    _ <- table1.filter(_.id1 === id).delete 
    _ <- table2.filter(_.id2=== id).delete 
    _ <- table3.filter(_.id3=== id).delete 
    _ <- table4.filter(_.id4=== id).delete 
} yield()).transactionally) 
val result = Await.result(action, Duration.Inf) 
  • これは、と次のようになります。

    • これは、理解のために、次のようになります。

      は、それがどのように見えるかを確認するための取引で4文との例を見ていることができますflatMap/map S:

      val action = db.run(
          table1.filter(_.id1 === id).delete.flatMap (_ => 
          table2.filter(_.id2 === id).delete.flatMap (_ => 
           table3.filter(_.id3 === id).delete.map (_ => 
           table4.filter(_.id4=== id).delete 
          ) 
          ) 
      ).transactionally 
      ) 
      val result = Await.result(action, Duration.Inf) 
      
  • +0

    あなたの例が正しくないように見えます。それぞれの 'map'呼び出しは実際には' flatMap'呼び出しでなければなりません。それ以外の場合、マップ内の最後のアクションは実行されません。アクションを作成して破棄します。 –

    関連する問題