Events Grails2.5 afterUpdate—它在事务生命周期中被称为什么点?

Events Grails2.5 afterUpdate—它在事务生命周期中被称为什么点?,events,grails,gorm,Events,Grails,Gorm,如果我们在grails中的域对象(例如我们的会话对象)上添加afterUpdate事件代码: 它是在提交更新后调用的,还是在刷新更新后调用的,还是其他 如果更新失败(例如约束或乐观锁定失败),是否仍会调用after事件 afterUpdate是否与更新处于同一事务中 执行更新的服务方法的提交是否会等到afterUpdate方法完成,如果是,是否有办法解决这个问题(除了创建一个新线程) 我们有许多grails应用程序实例运行在mutliple Tomcat上。每个都有一个会话过期石英作业,用于使会

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

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

    作业基本上说是getAllSession with lastUpdated>xxx,然后循环调用session.close(session.Expired)

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

    理论上,同一个会话可以同时关闭两次,但这并不重要(目前)

    现在,我们希望自动兑现过期(或终止)会话的客户。兑现过程需要调用外部支付系统,这可能需要长达1分钟的时间,并且可能会失败(但不应阻止会话关闭或“锁定”其他会话)

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

    另一个未知问题是调用save和commit如何处理乐观锁定。例如,如果您调用save(flush=true),并且没有收到错误回复,您是否可以保证提交工作正常(避免数据库崩溃),或者是否存在这样的情况

  • 它是在提交更新后调用的,还是在更新完成后调用的 脸红,还是别的
    • 更新完成后,但事务尚未提交。所以,若afterUpdate内部发生异常,事务将回滚
  • 如果更新失败(例如约束或乐观锁定失败),是否仍会调用after事件
    • 没有
  • 更新后是否与更新处于同一事务中
  • 执行更新的服务方法的提交是否会等到afterUpdate方法完成,如果是,是否有任何方法 绕过此问题(创建新线程除外)
    • 没有捷径可走