如果我们在grails中的域对象(例如我们的Session对象)上添加afterUpdate事件代码:
我们有多个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),并且你没有收到错误,你能保证提交能否正常工作(阻止数据库崩溃),还是有可能失败的情况?
答案 0 :(得分:1)
- 是在提交更新后,还是在提交更新后调用 脸红了,还是其他?
醇>
- 如果更新失败(例如约束或乐观锁失败),是否还会调用after事件?
醇>
- 更新后是否与更新处于同一交易中?
醇>
- 执行更新的服务方法的提交是否等到afterUpdate方法完成后,如果是这样,有没有办法 围绕这个(除了创建一个新线程)?
醇>