How can I make the following controller threadsafe in rails 4 with postgresql:
def controller_action
if Model.exists(column_name:\"some_value\")
else
Contrary to the comments, concurrent inserts on the same table are entirely permissible in PostgreSQL, so there's a race condition here.
To make this safe you must have a unique
constraint (or primary key
) on column_name
. Duplicate inserts will then throw an exception which you can catch and retry with an update.
If you don't have a unique constraint, then you must LOCK TABLE ... IN EXCLUSIVE MODE
to prevent concurrent upserts. Or use one of the concurrency-safe methods described in:
How to UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL?