Đin*_*hâu 8 service grails spring transactions transactional
我正在使用Grails Web应用程序,在使用Grails服务时我遇到了很多奇怪的事情.所以我想就此问一些问题,让我更多地了解Grails服务.这对我来说非常有用(也许对其他人来说^ _ ^).提前致谢.
如果服务配置为static transactional = true,那么在使用脏对象并在Hibernate会话中被锁定的任何方法调用后,它是否会刷新对DB的每个数据更改?
我可以@Transactional在课程级别使用注释而不是static transactional = true吗?是否有可能将@Transactional(readOnly = true)某些方法放在我希望它们从DB读取(查询,查找)数据?
事务继承怎么样?我的意思是,如果配置了父服务static transactional = true,并且子服务有它自己的@Transactional注释(在类上)和一些@Transactional(readOnly = true)(在某些方法上),如果我从子节点调用父节点的方法会发生什么?
事务是否适用于抽象服务?因为我知道,使用抽象服务我们无法初始化它的bean,也许在启动应用程序时,Grails上下文中存在一些差异.
你应该问每个问题一个问题:)
对于问题#1,是的 - Spring/Hibernate集成确保在提交之前发生刷新.所以调用save(),并delete()会就脸红,而且也没有必要添加flush: true要么.此外,save()除非您打电话,否则您尚未呼叫的脏实例也将被刷新discard().
对于#2:默认情况下,服务是事务性的,因此transactional = true实际上是多余的 - 您只需指定它即可transactional = false.但是,只有在没有@Transactional注释的情况下才会创建自动事务包装器.如果您有一个或多个注释,那么那些定义了事务划分.所以默认情况下(即没有注释,也没有transactional属性或者transactional = true)所有方法都是事务性的,但是如果只注释方法的一个子集,那么只有那些是事务性的.
通常,当您需要非默认行为(即自定义传播,隔离,超时等)时,您可以使用注释(或者像您的示例中那样将其设置为只读).
您可以在类级别注释以对所有方法具有相同的配置,并可选择注释单个方法以覆盖类范围默认值.
对于#3和#4,适用标准规则(参见#2).如果子类有注释,那么transactional = true从该类或父类中将被忽略,因为通过使用注释,您告诉Grails您自己正在配置事物.
由于无法实例化抽象服务,因此实际实例化的具体子类将具有来自基类和自身的组合行为.如果一切都很transactional = true简单,如果你有任何注释,那么他们就会定义规则.
调用超类中的方法就像调用当前类中的方法一样.但如果你没有考虑Spring的代理方法的含义,那么这种行为有点违反直觉.当您调用事务方法时,代理会拦截调用并加入活动事务,或者在需要时启动新事务,或者如果指定REQUIRES_NEW则启动新事务.但是一旦你进入真正的班级并调用另一种方法,你就会绕过代理.因此,如果您使用不同的注释设置调用另一种方法,它们将被忽略.如果您打算这样做,请参阅此邮件列表讨论,了解正在进行的工作以及如何使用它:http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service -outcome-td3619420.html
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |