如果多模型逻辑已经在为用户运行,那么防止多模型逻辑启动的 Rails 6 方法是什么?



我有一些复杂的业务逻辑,当控制器操作被触发时就会运行。该逻辑对与用户相关联的许多不同的表/记录执行各种更新。然而,如果路线连续命中足够快,则控制器调用的模型方法容易同时运行多次。

我想确保模型方法不会因为之前的请求而启动。

我已经读了一些书,听起来数据库锁定可能是我想要的,但我不清楚我想要什么类型的锁定,或者我是否真的想要它用于我的场景。我对这类问题缺乏经验。

我的逻辑不仅仅更新一个记录,它还更新一个用户记录,以及与该用户相关联的许多不同记录,跨越许多表。在我看来,给每个表添加一个lock_version似乎不正确,但也许这是正常的?我认为我想要的是在该方法运行时冻结用户和用户的相关关联记录,所以我正在寻找实现这一点的最佳方法。

Rails有什么方法可以(希望(尽可能少地增加复杂性来处理这个问题?如果锁定是我想要的,那么我是否需要将lock_version列添加到由于该逻辑而更新的每个模型中?

使用Ruby或一致数据库创建一个受处理用户唯一约束的互斥对象(如果您正在构建分布式应用程序(。

在一个操作开始处理之前,让它尝试获取一个互斥对象。如果因为另一个进程已经拥有它而失败,请停止。

确保已获取互斥的任何进程在停止处理后释放它。

lock_version很重要,但它只是一个数据库锁。它确保在对象已经由另一个进程更新的情况下无法保存该对象。

如果您正在进行原子提交,lock_version将起作用,但最好在进入提交阶段之前检查并发处理。A";过程水平";像这样的锁是您自己必须实现的。

最新更新