私はトランザクションのコードブロックを囲むことができるようにしたい。どのように暗黙のパラメータのコールコードに不可知論をフードの下で渡すようにするか?
def transactional(block: => Unit): Unit = {
implicit val conn: Connection = ???
conn.begin()
try {
block
conn.commit()
} catch {
case ex: Exception =>
conn.rollback()
throw ex
} finally {
conn.close()
}
}
今save
方法は、接続して何かをする必要がありますが、私がしたい:私はこのようなtransactional
機能を作るために考え
transactional {
save("something")
}
:呼び出し元のコードは、このような単純なする必要があります呼び出しコードをそれに不可知論にする(上記参照)。私はこのように素朴に実装しました。
def save(operation: String)(implicit conn: Connection): Unit = {
println(s"saving $operation using $conn")
}
もちろん、接続が見つからないというコンパイルエラーが発生します。接続をtransactional
ファンクションからsave
ファンクションに接続するには、どの部分が欠けていますか?
は修正されたバージョンは私が呼び出し元のコードのうち、接続を残すことができます、ありがとうございます。また、Tzach Zoharの答えでは、save関数のまわりでコードをラップすることができますが、それでも機能します。私はその理由でこの答えを受け入れます。ラッピングが必要ない場合、彼の答えはややシンプルです。 –