From 3fa1ac101c6256c9b40a003b4e61cd0a4cba60a9 Mon Sep 17 00:00:00 2001 From: Hugo Peixoto Date: Wed, 5 Apr 2023 23:04:48 +0100 Subject: [PATCH] Try to address the concurrency problem --- app/models/member.rb | 8 ++++++-- app/models/notification.rb | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/models/member.rb b/app/models/member.rb index 8b04518..de302f6 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -104,8 +104,12 @@ class Member < ApplicationRecord end def self.regenerate_all_notifications - Member.all.each do |member| - member.regenerate_notifications + ActiveRecord::Base.transaction do + ActiveRecord::Base.connection.execute('LOCK members IN ACCESS EXCLUSIVE MODE') + + Member.all.each do |member| + member.regenerate_notifications + end end end end diff --git a/app/models/notification.rb b/app/models/notification.rb index 21f9844..63587eb 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -4,8 +4,12 @@ class Notification < ApplicationRecord scope :scheduled_for_today, ->() { where(status: 'scheduled', to_be_sent_on: Date.today) } def self.send_scheduled_for_today - scheduled_for_today.each do |n| - n.deliver! + ActiveRecord::Base.transaction do + ActiveRecord::Base.connection.execute('LOCK members IN ACCESS EXCLUSIVE MODE') + + scheduled_for_today.each do |n| + n.deliver! + end end end