gpt4 book ai didi

events - Grails 2.5 afterUpdate - 它在事务生命周期的哪个点被调用?

转载 作者:行者123 更新时间:2023-12-02 14:41:07 30 4
gpt4 key购买 nike

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

  • 它是在提交更新之后调用,还是在刷新之后调用,或者其他?
  • 如果更新失败(例如约束,或乐观锁失败),是否仍会调用 after 事件?
  • afterUpdate 会与更新在同一个事务中吗?
  • 执行更新的服务方法的提交是否会等到 afterUpdate 方法完成,如果是这样,有没有办法解决这个问题(除了创建一个新线程)?

  • 我们有许多在多个 tomcat 上运行的 grails 应用程序实例。每个都有一个 session 过期 quartz 作业来过期我们的 session (域对象)

    这项工作基本上是用 lastUpdated > xxx 说 getAllSession,然后通过它们循环调用 session.close(Session.Expired)

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

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

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

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

    另一个未知数是调用 save 和 commit 如何与乐观锁定一起工作。例如。如果您调用 save(flush=true),并且您没有收到错误,您是否保证提交将起作用(使数据库崩溃),或者是否存在可能失败的情况?

    最佳答案

    1. Is it called after the update has been committed, or after it is flushed, or other?

  • 更新完成后,事务尚未提交。因此,如果 afterUpdate 内部发生异常,事务将被回滚。

    1. If the update failed (e.g. constraint, or optimistic lock fail), will the after event still be called?

  • 没有

    1. Will after Update be in the same transaction as the update?


    1. Will the commit of the service method which did the update wait till the afterUpdate method is finished, and, if so, is there any way round this (except creating a new thread)?

  • 没有简单的方法
  • 关于events - Grails 2.5 afterUpdate - 它在事务生命周期的哪个点被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268976/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com