在已检查的异常上回滚Groovy事务

时间:2013-05-22 16:58:42

标签: groovy transactions

我只是在一个项目中将Groovy版本从1.76升级到2.1,我有一个单元测试如下:

try{
    sql.withTransaction{
        sql.execute("Update table set name='tested' where id = 1")
        throw new Exception()
    }
}
catch(ignore){}

//Assert that name has been rolled back from update to 'tested'

以前在1.76中,这工作正常 - 抛出的异常导致事务回滚,一切正常。但是,2.1中的情况并非如此 - 我已经看到,如果我更改我的异常以抛出RuntimeException,那么它会正确回滚。

我的假设是Groovy不再为已检查的异常回滚我的事务 - 这是可以配置的吗?我可以在所有事务上进行回滚,而不是必须返回并更新我的所有代码以在捕获异常时显式回滚吗?

1 个答案:

答案 0 :(得分:1)

throw new SQLException()应该回滚事务。

SQLExceptionRuntimeExceptionErrorwithTransaction内被捕获,并作为SQLException重新投放,最终会回滚事务。 @摘自groovy来源。

要覆盖为所有测试抛出SQLException的功能,可以在setUp中将其模拟为

Sql.metaClass.withTransaction = {Closure clos ->
   throw new SQLException()
}