From d270b857341efe6d878f3c23ca8707608c97d9d9 Mon Sep 17 00:00:00 2001 From: Andreas Brandl Date: Mon, 5 Mar 2018 17:12:22 +0100 Subject: Nested transaction for find_or_create_by! queries. For background see https://apidock.com/rails/v4.2.7/ActiveRecord/Relation/find_or_create_by. --- app/models/user_interacted_project.rb | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'app/models/user_interacted_project.rb') diff --git a/app/models/user_interacted_project.rb b/app/models/user_interacted_project.rb index 064746457cf..68cb3c01c50 100644 --- a/app/models/user_interacted_project.rb +++ b/app/models/user_interacted_project.rb @@ -23,11 +23,17 @@ class UserInteractedProject < ActiveRecord::Base } cached_exists?(attributes) do - begin - find_or_create_by!(attributes) - true # not caching the whole record here for now - rescue ActiveRecord::RecordNotUnique - retry + transaction(requires_new: true) do + begin + where(attributes).select(1).first || create!(attributes) + true # not caching the whole record here for now + rescue ActiveRecord::RecordNotUnique + # Note, above queries are not atomic and prone + # to race conditions (similar like #find_or_create!). + # We retry and make sure the outer transaction (if any) + # is not aborted because of this. + retry + end end end end -- cgit v1.2.3