トランザクションクエリブロックのデバッグ中に、このヘッドスクラッチャーに遭遇しました。
何らかの理由で、左折/失敗操作で接続のロールバックが発生したにもかかわらず、成功/右の結果もロールバックされていました。
例:
// returns Either[String, Int]
db.handle withSession { implicit ss: Session=>
ss.withTransaction {
val result = for {
u <- either(User.insert(User(model)), ss)
ur <- either(UserRole.insert( UserRole(u) ), ss)
m <- either(Membership.insert(Membership(u)), ss)
} yield u
// bad: rollback occurs regardless of left/right outcome
result fold( {ss.rollback; Left(_)}, Right(_) )
// good: rollback occurs as expected on left outcome only
result fold( e=>{ss.rollback; Left(e)}, Right(_) )