summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/user_interacted_project.rb16
1 files changed, 11 insertions, 5 deletions
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