Grails服务不是交易性的吗?

Joh*_*tle 5 service grails transactions

根据官方文档和我读过的书籍,服务是跨国的默认.但是,即使我们立即抛出RuntimeException,我们也会提交记录.

例如:

class MyService {
    def someMethod() {
        new someDomainObject().save(failOnError:true)
        throw new RuntimeException("rollback!")
    }
}
Run Code Online (Sandbox Code Playgroud)

并且这样称呼它:

class myController{
   MyService myService
    def someMethod() {
         myService.someMethod()
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,在调用调用服务的控制器之后,然后检查是否通过使用mysql工作台附加到DB来创建行,该行确实已提交但未回滚.

所以我们接下来试过这个:

class MyService {
    static transactional = true
    def someMethod() {
        new someDomainObject().save(failOnError:true)
        throw new RuntimeException("rollback!")
    }
}
Run Code Online (Sandbox Code Playgroud)

同样的问题.

接下来我们试了一下:

@Transactional
class MyService {
    static transactional = true
    def someMethod() {
        new SomeDomainObject().save(failOnError:true)
        throw new RuntimeException("rollback!")
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,这是有效的.但是,我们不明白为什么.

注意:使用MYSQL的Grails 2.4.4:

development {
    dataSource {
        dbCreate = "create-drop"
        url = "jdbc:mysql://127.0.0.1:3306/db"
        username = "user"
        password = "***"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正常的行为吗?
@Transactional与static tranasctional = true不同吗?

服务类由intellij 14使用Grails视图中Services文件夹中的"new groovy class"选项生成."新的Grails服务"选项对我们不起作用,它什么都不做,所以我们必须在正确的位置"手动"创建所有groovy类.

Joh*_*tle 10

好的,找到原因,或者知道:

"使用Transactional注释服务方法会禁用该服务的默认Grails事务行为"

所以我碰巧注释了服务中的许多方法之一 @Transactional(propagation=Propagation.REQUIRES_NEW),认为其他方法将保留其默认的事务,但是,如果你做出任何声明,它会默默地删除所有其他方法的transactoinal行为,即使你说" static transactional = true"

这似乎是相当危险的,从现在开始,我将注释每个服务类,@Transactional以避免陷入困境.