访问belongsTo或其他关系时悲观锁定的行为是什么?

时间:2019-05-24 14:36:12

标签: grails gorm

我在密码重置代码中使用了pessimistic locking

基本上,用户会提供令牌(在先前的交易中通过电子邮件发送给他们),然后在服务中使用PasswordResetRequest.findByToken(token, [lock: true])来检索状态。发生一些验证(令牌是否有效?请求是否已过期?),然后使用request.userPasswordResetRequest belongsTo User关系)检索与此重置请求关联的用户。然后更新用户密码,保存用户,并删除PasswordResetRequest

我知道根据文档,PasswordResetRequest将被锁定(因此,在检索它时将阻止一个新查询)。但是与之关联的User呢?如果我发生其他一些请求,即通过ID读取用户,更新并保存用户(例如,用户在重置密码的同时奇迹般地更新了帐户),会发生什么情况?

所以我的问题是,在锁定belongsTo父母的孩子时,父母也被锁定了吗?如果没有,我将如何实现这一目标(我需要执行急​​切的获取或其他操作)吗?

我也对其他关系的行为感到好奇。是否有讨论所有这些内容的文档?

1 个答案:

答案 0 :(得分:0)

根据我自己的锁定经验,我建议阅读一些有关数据库锁定的文章(DB locks),至少它对了解如何以及为什么某些记录被锁定而其他记录没有被锁定有很大帮助。

对于您的问题,已经触发锁定时将提取的所有条目也将被锁定。 因此,如果您执行request.user,则User实例也将被锁定(通过ID)。

此外,如果您不确定所有功能是否正常,我建议您进行一次小型测试。在用户“初始化”用户之后,在密码重置方法中插入sleep(2000)(稍作延迟),然后调用另一个尝试更新用户输入的方法,该方法将失败。