Откат перевода в MySQL, если исключение приходит в Scala. Я использую Scala с Play Framework и MySQL в качестве бэкэнда

Я использую Scala и MySQL. Я хочу применить откат в моем коде, если возникнет какое-либо исключение, как я могу решить эту проблему. запрос выбора дает исключение, поэтому я хочу откат вставки команды.

def demoRollback(user_id:String)={
try{
  DB.withConnection{ implicit c=>
    val roll=SQL("start transaction").execute()
    val result=SQL("insert into demo value('50','jjjjj')").executeInsert()
     println("the select query..........="+result)
    val user=SQL("select user_id from demo where user_id=1")
    val result2=user().map(row=>
    row[String]("user_id")).toList


    result
  }
}
catch{
  case e :Exception =>{
    DB.withConnection{implicit c=>
    val back=SQL("rollback").execute
    }
    println(e)
  }
}

}

1 ответ

Решение

Я думаю, что в этом случае простой способ отключить параметр автоматической фиксации. Затем вы можете выполнить несколько запросов в одной и той же транзакции, но вы должны вручную установить коммит и откат (нам не нужно окончательно блокировать, потому что withConnection Автоматически закрыть связь для нас):

  val log = Logger(controllers.Application.getClass)

  def demoRollback(user_id: String) = {
    var r: Option[Long] = None
    DB.withConnection {
      implicit c =>
        c.setAutoCommit(false)
        try {
          val result = SQL("insert into demo value('50','jjjjj')").executeInsert()
          log.debug(s"the select query..........= $result")
          val user = SQL("select user_id from demo where user_id=1")
          val result2 = user().map(row => row[String]("user_id")).toList
          c.commit()
          r = result
        } catch {
          case e: Exception => c.rollback()
        }
    }
    r
  }
Другие вопросы по тегам