会话与事务回滚问题

时间:2014-09-10 03:29:38

标签: scala slick

def withSession(testCode: Session => Any)(implicit db : scala.slick.driver.PostgresDriver.simple.Database ) {

    val session = db.createSession()
    session.conn.setAutoCommit(false)
    try {
      testCode(session)
    } finally {
      session.rollback()
      session.close()
    }
}

创建上面的fixture来测试数据库代码并在测试结束后回滚。 测试看起来如下

test("insert a row into employee table") {
    withSession { implicit session =>
     val emp = EmployeeRow(-1, Option(1),
          "TestEmployee",Option(1), Option("abc"), None) 

      EmployeeService.save(emp)
    }    

}

其中EmployeeService.save()

 def save(emp: EmployeeRow)(implicit session : Session): EmployeeRow = session.withTransaction{
 (employee returning employee) += emp
}

注意save()方法现在是最小的,它将与其中的其他服务API进行交互,因此需要session.withTransactionsave()内的所有工作捆绑到单个工作单元中。

因为我使用session.withTransactionwithSession fixture试图在session块中回滚finally,所以它会抛出

scala.slick.SlickException: Cannot roll back session in auto-commit mode
at scala.slick.jdbc.JdbcBackend$BaseSession.rollback(JdbcBackend.scala:415)
at com.company.core.tests.DatabaseSpec$class.withSession(DatabaseSpec.scala:25)
at 

1 个答案:

答案 0 :(得分:0)

是。 withTransaction检查您是否已经在事务内部,并且在这种情况下什么都不做。

,在测试代码中使用另一个withTransaction块,而不是手动设置自动提交。

如果仍然无效,请考虑开票:https://github.com/slick/slick/issues