Grails 2.5 afterUpdate - 它被称为事务生命周期中的哪一点?

时间:2015-12-14 14:05:12

标签: events grails gorm

如果我们在grails中的域对象(例如我们的Session对象)上添加afterUpdate事件代码:

  1. 是在提交更新后,还是在刷新或其他更新后调用?
  2. 如果更新失败(例如约束或乐观锁失败),是否还会调用after事件?
  3. afterUpdate是否与更新处于同一交易中?
  4. 执行更新的服务方法的提交会等到afterUpdate方法完成,如果是这样,有没有办法解决这个问题(创建一个新线程除外)?
  5. 我们有多个grails应用程序在mutliple tomcats上运行的实例。每个都有一个会话到期石英作业到期我们的会话(域对象)

    该作业基本上用lastUpdated>表示getAllSession。 xxx,然后循环调用session.close(Session.Expired)

    Session.close只是将session.status设置为Expired。

    理论上,同一会话可以同时关闭两次同时购买在两台服务器上运行的作业,但这并不重要(还)

    现在我们想要通过过期(或被杀)会话自动提现客户。提款流程需要拨打外部支付系统,这可能需要1分钟,并且可能会失败(但不应该停止会话关闭或“锁定”其他会话)

    如果我们在会话域对象上使用了afterUpdate,我们可以检查session.status,并在事务之外或在另一个线程(例如使用Executors)中触发cashout。但这是非常危险的 - 因为我们不知道确切的行为。例如。如果更新失败,它还会尝试执行afterUpdate调用吗?我们假设这样,因为我们猜测提交不会发生到以后。

    另一个未知的是调用save和commit如何使用乐观锁定。例如。如果你调用save(flush = true),并且你没有收到错误,你能保证提交能否正常工作(阻止数据库崩溃),还是有可能失败的情况?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 是在提交更新后,还是在提交更新后调用   脸红了,还是其他?
  2.   
  • 更新完成后,尚未提交事务。因此,如果afterUpdate内发生异常,则将回滚事务。
  
      
  1. 如果更新失败(例如约束或乐观锁失败),是否还会调用after事件?
  2.   
  • 没有
  
      
  1. 更新后是否与更新处于同一交易中?
  2.   
  
      
  1. 执行更新的服务方法的提交是否等到afterUpdate方法完成后,如果是这样,有没有办法   围绕这个(除了创建一个新线程)?
  2.   
  • 没有简单的方法